Эта проблема возникла в модуле, который я пишу, но я сделал минимальный случай, который проявляет такое же поведение.Почему здесь не работает операция ввода?
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_|
, чтобы сделать это проще.
Фактическая ошибка:
inferred type arguments [Nothing,Minimal[Int]] do not conform to method apply's type parameter bounds [T,X <: Sugar.S[T]]
Да, это решение отлично работает в моем случае. Он также чище, чем решение Джошуа (извините, Джошуа!). Можете ли вы объяснить, почему работает решение Джошуа? – Dylan
Ответ обновлен, чтобы дать объяснение, почему решение Джошуа также работает. –