2015-02-07 2 views
-1
trait SomeClass { 
    ... 
} 

trait AnotherClass[+V <: SomeClass] { 
    ... 
} 

trait SomeAnotherClass[+V <: SomeClass] { 
    protected def someFunc[W >: V](anotherClass: AnotherClass[W]) = { 
      ... 
    } 
} 

я получаю эту ошибку:аргументы типа [W] не соответствуют Черта границ параметров типа

type arguments [W] do not conform to trait AnotherClass's type parameter bounds [+V <: SomeClass] 
[error] protected def someFunc[W >: V](anotherClass: AnotherClass[W]) = ... 
[error]             ^
[error] one error found 

Я не получаю ошибку, когда я [W >: V <: SomeClass] вместо просто [W >: V], но в в этом случае он затеняет переменную. Пожалуйста, помогите, как это решить.

UPDATE:

protected def someFunc(anotherClass: AnotherClass[V]) = { 
       ... 
} 

Я получаю ошибку covariant type V occurs in contravariant position in type

ответ

2

Когда вы говорите W >: V, вы говорите, что параметр типа W из someFunc должен иметь более низкий тип, связанный из V. Это означает, что W может быть V или любым его супертипом, который разбивает границы типов, которые V <: SomeClass.

Например Any >: SomeClass в этой гипотетической ситуации, так W может быть Any, но Any = V <: SomeClass не тоже не верно, так что границы типа ломаться.

Когда вы говорите W >: V <: SomeClass, то W имеет нижней границу V и верхней границей SomeClass. Верхняя граница SomeClass для W важна, поскольку содержащийся тип AnotherClass также имеет верхнюю границу SomeClass. Без этого он попытается разрешить AnotherClass[Any] (или какой-нибудь другой супер-тип, который не SomeClass), что, конечно, не может.

Как вы можете это решить? Вы выбрали один из способов сделать это. У вас не может быть W >: V и AnotherClass[+V <: SomeClass] одновременно. Это просто не сработает, потому что тип ограничивает конфликт.

+0

Вы сказали, что прием AnotherClass [V] должен быть прекрасным. но, 'protected def someFunc (anotherClass: AnotherClass [V])' дает ошибку 'ковариантный тип V встречается в контравариантном положении в типе AnotherClass' –

+0

Я исправил свой ответ здесь, чтобы объяснить, почему он работает для' W>: V <: SomeClass' , мой предыдущий комментарий был ошибочным. Почему вы хотите, чтобы он был неограничен сверху, я не знаю. –