[英]Scala Existential type weird behavior
我的 REPL 中有以下內容:
scala> trait T[A]
defined trait T
scala> :kind T[A] forSome {type A}
T[_]'s kind is A
scala> :kind T[_]
T[_]'s kind is A
現在當我這樣做時:
trait e[_] extends T[_]
我得到
error: class type required but T[_] found
但是,以下工作:
scala> trait e[_] extends T[Int]
defined trait e
和
scala> :kind T[Int]
T[Int]'s kind is A
為什么 T[Int] 與 T[_] 的處理方式不同,而它們屬於同一類?
這不是關於種類,而是關於類型是否是類類型(包括特征)。
你可以寫
type T <: U
對於每種類型U
但
trait T extends U
僅適用於類類型U
。
子類型化和繼承/子類化是不同的。
與trait T[A]
對應的類型是每個類型A
的類類型。 所以T[Int]
是一個類類型。 (當您編寫extends A[B]
,重要的是A
是類類型, B
可以是任意類型。)
存在類型(如T[_]
又名T[A] forSome {type A}
)不是類類型。 (您也可以將T[_]
視為所有T[A]
的超類型。實際上, T[_]
是所有T[A]
的最小上限)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.