Tuyên bố của bạn đã hoạt động như nghĩa vụ, nghĩa là bạn đang hạn chế loại T
cũng như Key
và Value
. Cách bạn đã viết nó, tuy nhiên, scala sẽ phàn nàn nếu bạn phát hành cái gì đó như
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]]
vì các loại của cả hai Key
và Value
đã trao bằng tuyên bố cựu của bạn. Do đó, thao tác này sẽ hoạt động
scala> new Foo[SpecialOtherT, Key, Value]
res20: Foo[SpecialOtherT,Key,Value] = [email protected]
có thể không muốn bạn muốn. Bạn có thể làm điều đó như thế này
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]
Tại dòng dưới cùng, vì các loại Key
và Value
phụ thuộc hoàn toàn vào T
nó là hơi thừa để có tất cả các thông tin cần thiết khi làm việc với Foo
.Vậy tại sao không sử dụng một tuyên bố loại bên trong như vậy:
class Foo[T <: OtherT] {
type K = Key[T]
type V = Value[T]
}
Sau đó, bạn sẽ có quyền truy cập đến các loại K
và V
từ bên trong lớp nhưng sẽ không cần phải gõ nó mỗi khi bạn tạo ra một câu trả lời mới:
scala> new Foo[SpecialOtherT]
res23: Foo[SpecialOtherT] = [email protected]
scala> new Foo[Int]
<console>:11: error: ...
Cảm ơn! Rất thông tin. Câu trả lời duy nhất của tôi cho "Vì vậy, tại sao không sử dụng một tuyên bố kiểu bên trong" là tôi muốn có những loại đó cho K và V suy luận về sự khởi tạo. – duckworthd
Tôi không chắc tôi hiểu vì loại thực sự được phỏng đoán. Tùy thuộc vào trường hợp sử dụng của bạn, bạn vẫn có thể sử dụng loại từ "bên ngoài", ví dụ: 'class Foo [T]; lớp Bar [T] {loại Wee = Foo [T]}; def doSomething [T] (b: Bar [T]) (ngầm định mf: Manifest [Bar [T] #Wee]) {Console println mf} ', và sau đó' doSomething (new Bar [Double]) '. Đồng ý, đó là một ví dụ bẩn. – fotNelton