Ваше заявление уже работает как предполагается, т. Е. Вы ограничиваете тип T
, а также Key
и Value
. То, как вы написали это, однако, будет жаловаться Scala, если выпустить что-то вроде
scala> class Foo[T <: OtherT, Key[T], Value[T]]
defined class Foo
scala> new Foo[SpecialOtherT, Key[SpecialOtherT], Value[SpecialOtherT]]
<console>:13: error: Key[SpecialOtherT] takes no type parameters, expected: one
new Foo[SpecialOtherT, Key[SpecialOtherT], Value[SpecialOtherT]]
, так как типы обоих Key
и Value
уже даны вашим предыдущего заявления. Следовательно, это будет работать
scala> new Foo[SpecialOtherT, Key, Value]
res20: Foo[SpecialOtherT,Key,Value] = [email protected]
который, вероятно, не хочет, чтобы вы хотели. Вы можете сделать это, как этот
scala> class Foo[T <: OtherT, K <: Key[T], V <: Value[T]]
defined class Foo
scala> new Foo[SpecialOtherT, Key[SpecialOtherT], Value[SpecialOtherT]]
res21: Foo[SpecialOtherT,Key[SpecialOtherT],Value[SpecialOtherT]] = [email protected]
На нижней строке, так как типы Key
и Value
зависят исключительно от T
это несколько излишним иметь все, что избыточную информацию при работе с Foo
.Так почему бы не использовать внутреннее объявление типа так:
class Foo[T <: OtherT] {
type K = Key[T]
type V = Value[T]
}
Тогда вы бы иметь доступ к типам K
и V
из класса, но не нужно будет вводить его каждый раз, когда вы создаете новый ответ:
scala> new Foo[SpecialOtherT]
res23: Foo[SpecialOtherT] = [email protected]
scala> new Foo[Int]
<console>:11: error: ...
Спасибо! Очень информативно. Мой единственный ответ на «Так почему бы не использовать объявление внутреннего типа» заключается в том, что я хочу иметь эти типы для K и V, которые вызывают при создании экземпляра. – duckworthd
Я не уверен, что понимаю, потому что тип фактически выведен. В зависимости от вашего прецедента вы все равно можете использовать тип «снаружи», например. 'class Foo [T]; класс Bar [T] {тип Wee = Foo [T]}; def doSomething [T] (b: Bar [T]) (неявный mf: Manifest [Bar [T] #Wee]) {Console println mf} ', а затем' doSomething (новая панель [Double]) '. Согласен, это грязный пример. – fotNelton