首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T forSome{ T}型

T forSome{ T}型
EN

Stack Overflow用户
提问于 2016-09-22 16:48:29
回答 1查看 170关注 0票数 0

我正在浏览关于Scala中存在类型的凿岩机博客。在阅读完之后,我对类型进行了实验,并按照伦杜贾博客中给出的方式检查类型的相等性。

代码语言:javascript
复制
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

我第一次检查的是:

代码语言:javascript
复制
type_==[Any, T forSome{type T}] // true

我无法理解的是,T forSome{type T}对任何类型都满意,但为什么它的类型是Any。假设,由于Any是所有可能类型的共同祖先,所以它们是相等的是合理的。以类似的方式我能推理。

代码语言:javascript
复制
type_==[Array[Any], Array[T forSome{type T}]] // true
type_==[List[Any], List[T forSome{type T}]] // true

我不能用同样的推理把这件事做好。

代码语言:javascript
复制
type_==[Array[Any], (Array[T] forSome{type T})] // false
type_==[List[Any], (List[T] forSome{type T})] // true

我在这里错过了什么?我的推理方式有缺陷吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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是什么。你刚刚检查了AnyT forSome {type T}是相等的,所以.但是,对于另外两种情况,您根本不能使用相同的推理:ABF是什么?

Array[Any]Array[T] forSome { type T }不一样,因为假设您有一个值

代码语言:javascript
复制
val array: Array[String] = Array("a")

然后它有Array[T] forSome { type T }类型(您知道为什么吗?):

代码语言:javascript
复制
val arrayForSome: Array[T] forSome { type T } = array // compiles

代码语言:javascript
复制
val arrayOfAny: Array[Any] = array

不编译(因为Array是不变的)。很明显,Array[T] forSome { type T }Array[Any]是不同的:一个值可以有其中一个类型,而没有另一个类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39644673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档