La tua dichiarazione funziona già come previsto, ovvero stai limitando il tipo di T
e Key
e Value
. Il modo in cui hai scritto, tuttavia, scala si lamenterà se si emette qualcosa come
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]]
perché i tipi di entrambi Key
e Value
sono già date dal vostro precedente dichiarazione. Quindi funzionerà
scala> new Foo[SpecialOtherT, Key, Value]
res20: Foo[SpecialOtherT,Key,Value] = [email protected]
che probabilmente non si desidera si desideri. Si potrebbe fare come questo
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]
In linea di fondo, dal momento che i tipi di Key
e Value
dipendono esclusivamente T
è un po 'superfluo avere tutte le informazioni ridondanti quando si lavora con Foo
.Allora perché non utilizzare una dichiarazione di tipo interna in questo modo:
class Foo[T <: OtherT] {
type K = Key[T]
type V = Value[T]
}
Poi si avrebbe accesso a tipi K
e V
dall'interno della classe, ma non avrebbe bisogno di digitare ogni volta che si crea una nuova risposta:
scala> new Foo[SpecialOtherT]
res23: Foo[SpecialOtherT] = [email protected]
scala> new Foo[Int]
<console>:11: error: ...
Grazie! Molto informativo. La mia unica risposta a "Allora, perché non usare una dichiarazione di tipo interno" è che voglio avere quei tipi per K e V dedotti in istanziazione. – duckworthd
Non sono sicuro di aver capito perché il tipo in realtà viene dedotto. A seconda del caso d'uso, puoi comunque utilizzare il tipo dal "fuori", ad es. 'classe Foo [T]; class Bar [T] {type Wee = Foo [T]}; def doSomething [T] (b: Bar [T]) (implicito mf: Manifest [Bar [T] #Wee]) {Console println mf} ', quindi' doSomething (new Bar [Double]) '. D'accordo, è un esempio sporco. – fotNelton