Недавно я наткнулся на странное (мне) сообщение об ошибке компилятора. Рассмотрим следующий код:
trait Foo {
type Res <: Foo
type Bar[X <: Res]
}
class MyFoo extends Foo {
override type Res = MyFoo
override type Bar[X <: Res] = List[X]
}
type FOO[F <: Foo, R <: Foo, B[_ <: R]] = F { type Res = R;
type Bar[X <: R] = B[X] }
def process[F <: Foo, R <: Foo, B[_ <: R]](f: FOO[F, R, B]) {}
Теперь, если я хочу вызвать метод process
, я должен явно писать параметры типа:
process[MyFoo, MyFoo, List](new MyFoo) // fine
Если я пишу:
process(new MyFoo)
или
process((new MyFoo): FOO[MyFoo, MyFoo, List])
Появляется следующее сообщение об ошибке:
предполагаемые типы аргументов типа (MyFoo, MyFoo, List [X]) не соответствуют ожидаемым типам параметров типа (тип F, тип R, тип B). Параметры списка [X] не соответствуют ожидаемым параметрам типа B: класс List имеет один параметр типа, но тип B имеет один
Почему компилятор не может вывести типы (хотя я явно указал их при параметре вызова)? И что означает это class List has one type parameter, but type B has one
? Что-то есть, но у другого есть и один, и поэтому они не подходят друг к другу.