我正在浏览有关Scala中存在类型的drmacvier博客。阅读之后我正在尝试使用类型,我正按照rnduja博客中给出的方式检查类型是否相等。
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 :(得分:1)
我无法理解的是T forSome {type T}对任何类型都满意,但为什么它的类型为Any
任何值(不是任何类型)都有某种类型(至少类型Any
)。因此,某些类型T
的类型为T
。但这意味着它也有类型T forSome { type T }
。因此,Any
类型的任何值都具有类型T forSome { type T }
(反之亦然)。
对于前两个比较:如果A
等于B
,那么F[A]
应该等于F[B]
,无论F
是什么。您刚刚检查过Any
和T forSome {type T}
是否相等,所以...但是您根本无法对其他两种情况使用相同的推理:{{1} },A
和B
是?
F
与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 }
是不同的:一个值可以有这些类型中的一个而没有另一个。