您的聲明已按預期工作,即您限制的類型爲T
以及Key
和Value
。你寫它的方式,但是,斯卡拉會如果發出類似
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 2012-02-09 08:37:05
我不確定我是否理解,因爲這個類型實際上是推斷的。根據您的使用情況,您仍然可以使用「外部」中的類型,例如'Foo [T]; class Bar [T] {type Wee = Foo [T]}; def doSomething [T](b:Bar [T])(隱式mf:Manifest [Bar [T] #Wee]){Console println mf}',然後'doSomething(新Bar [雙]]''。同意,這是一個骯髒的例子。 – fotNelton 2012-02-09 09:07:22