2016-09-22 101 views
0

我正在通過drmacvier博客瞭解Scala中的存在類型。閱讀完後,我正在試驗類型,我正在按照以下方式檢查類型的相等性,如rnduja博客中所述。T的類型forSome {type T}

def implicitly[A](implicit a: A) = a 

// To check equality of two types 
class =:=[A, B] 
implicit def equalTypeInstance[A] = new =:=[A, A] 
def type_==[A, B](implicit ev: A =:= B = null) = ev != null 

// To check subtype relation between two types 
class <:<[-A, +B] 
implicit def subTypeInstance[A] = new <:<[A, A] 
def type_<[A, B](implicit ev: A <:< B = null) = ev != null 

我檢查的第一件事情是這樣的:

type_==[Any, T forSome{type T}] // true 

什麼我不明白是T forSome{type T}是任何類型的滿意,但爲什麼它的類型Any。假設,因爲Any是所有可能類型的共同祖先,所以它們是平等的。用我能夠推理的類似方式。

type_==[Array[Any], Array[T forSome{type T}]] // true 
type_==[List[Any], List[T forSome{type T}]] // true 

我不能以相同的推理得到這個權利。

type_==[Array[Any], (Array[T] forSome{type T})] // false 
type_==[List[Any], (List[T] forSome{type T})] // true 

我在這裏錯過了什麼?我的推理方式有缺陷嗎?

+0

大概是因爲List是協變的而且數組是不變的? –

回答

1

什麼我不明白爲T forSome {類型T}是任何類型的滿意,但爲什麼它的類型任何

任何(沒有任何類型)有一些類型的(至少類型Any)。因此,對於某些類型T,它的型號爲T。但這意味着它也有類型T forSome { type T }。因此,Any類型的任何值的類型爲T forSome { type T }(反之亦然)。

對於前兩種比較:如果A等於B,然後F[A]應等於F[B],無論F是。你剛剛檢查過AnyT forSome {type T}是相等的,所以...但是你根本無法對其他兩種情況使用相同的推理:ABF是什麼?

Array[Any]是不一樣的Array[T] forSome { type T },因爲假設你有一個值

val array: Array[String] = Array("a") 

然後,它的類型是Array[T] forSome { type T }(你明白爲什麼?):

val arrayForSome: Array[T] forSome { type T } = array // compiles 

val arrayOfAny: Array[Any] = array 

不能編譯(因爲Array是不變的)。所以清楚Array[T] forSome { type T }Array[Any]是不同的:一個值可以具有這些類型之一,而不具有其他類型。