(См. Также два связанных вопроса: Scala не может вывести правильные аргументы типа и Тип, выведенный в Nothing в Scala )
Это выглядит как ограничениеВывод типа Scala, который намеренно не указан.В качестве обходного пути вы можете сделать вывод, сделав T
тип член из B
вместо параметра,
abstract class A
abstract class B { type T <: A }
class ConcreteA extends A
class ConcreteB extends B { type T = ConcreteA }
class Example[U <: B]( resolver: U )
object Test {
new Example( new ConcreteB )
}
При использовании членов типа полезно знать, чтоих можно представить как параметры типа, используя уточнение, как в ответе Майлза Сабина на: Почему эта циклическая ссылка с проекцией типа недопустима?
В ответе Жан-Филиппа Пелле на связанный с этим вопрос , вывод типа помог, сделав параметр типа более привязанным.Если вы введете дополнительный параметр типа в ConcreteB
, то вывод типа может сработать,
abstract class A
abstract class B[T <: A]
class ConcreteA extends A
class ConcreteB[T <: A] extends B[T]
class Example[T <: A, U[T0 <: A] <: B[T0]]( resolver: U[T] )
object Test {
new Example( new ConcreteB[ConcreteA] )
}
Scala 2.9 выдает таинственное сообщение об ошибке ниже, но Майлз Сабин указывает, что этоошибка, которая будет исправлена для 2.9.1
<console>:15: error: kinds of the type arguments (ConcreteA,ConcreteB[T0]) do not conform to the expected kinds of the type parameters (type T,type U) in class Example.
ConcreteB[T0]'s type parameters do not match type U's expected parameters: class ConcreteB has one type parameter, but type U has one
new Example( new ConcreteB[ConcreteA] )
^