我正在浏览关于Scala中存在类型的凿岩机博客。在阅读完之后,我对类型进行了实验,并按照伦杜贾博客中给出的方式检查类型的相等性。
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我在这里错过了什么?我的推理方式有缺陷吗?
发布于 2016-09-22 17:13:51
我所不能理解的是T forSome{ T}被任何类型所满足,但是为什么它的类型是
任何值(不是任何类型)都有某种类型(至少是Any类型)。因此,对于某些类型的T,它有类型T。但这意味着它也有T forSome { type T }类型。因此,Any类型的任何值都具有T forSome { type T }类型(反之亦然)。
对于前两个比较:如果A等于B,那么F[A]应该等于F[B],不管F是什么。你刚刚检查了Any和T forSome {type T}是相等的,所以.但是,对于另外两种情况,您根本不能使用相同的推理: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 }和Array[Any]是不同的:一个值可以有其中一个类型,而没有另一个类型。
https://stackoverflow.com/questions/39644673
复制相似问题