Эта проблема возникла в модуле, который я пишу, но я сделал минимальный случай, который демонстрирует такое же поведение.
class Minimal[T](x : T) {
def doSomething = x
}
object Sugar {
type S[T] = { def doSomething : T }
def apply[T, X <: S[T]] (x: X) = x.doSomething
}
object Error {
val a = new Minimal(4)
Sugar(a) // error: inferred [Nothing, Minimal[Int]] does not fit the bounds of apply
Sugar[Int, Minimal[Int]](a) // works as expected
}
Проблема в том, что компилятору удается определить внутренний параметр для Minimal
(Int
), но затем устанавливает другое вхождение T
в Nothing
, что, очевидно, не соответствует apply
. Это определенно одно и то же T
, поскольку удаление первого параметра заставляет второй жаловаться на то, что T не определен.
Есть ли какая-то двусмысленность, которая означает, что компилятор не может определить первый параметр, или это ошибка? Могу ли я изящно обойти это?
Дополнительная информация: этот код - простой пример попытки синтаксического сахара. Исходный код пытается сделать |(a)|
значением модуля a
, где a - вектор. Ясно, что |(a)|
лучше, чем писать |[Float,Vector3[Float]](a)|
, но, к сожалению, я не могу использовать unary_|
, чтобы упростить эту задачу.
Фактическая ошибка:
аргументы предполагаемого типа [Nothing, Minimal [Int]] не соответствуют границам параметра типа метода apply [T, X ‹: Sugar.S [T]]