加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

[Scala基础]--classOf[T]、getClass和 class

发布时间:2020-12-16 09:40:05 所属栏目:安全 来源:网络整理
导读:一、先举一个案例 上面显示了两者的不同之处,getClass 方法得到的是 Class[A]的某个子类,而 classOf[A] 得到是正确的 Class[A],但是去比较的话,这两个类型是equals为true的。 这里有细微的差别,体现在类型赋值时,因为java里的 Class[T]是不支持协变的

一、先举一个案例


上面显示了两者的不同之处,getClass 方法得到的是 Class[A]的某个子类,而 classOf[A] 得到是正确的 Class[A],但是去比较的话,这两个类型是equals为true的。



这里有细微的差别,体现在类型赋值时,因为java里的 Class[T]是不支持协变的,所以无法把一个 Class[_ < : A] 赋值给一个 Class[A]。


二、关于协变和逆变

1、C[T] A B 其中A <: B
若 C[A]:C[B] C 是 cotravariant
如果 C[A]和C[B]没有父子关系 那么C是nonvariant


2、Scala中是允许你自己定义是否是variant的

class C[+A]{…} C是covariant

[+T],covariant (or “flexible”) in its type parameter T,类似Java中的(? extends T),即可以用T和T的子类来替换T,里氏替换原则。

可以看到List的定义:

type List[+A] = scala.collection.immutable.List[A]  
协变的符号是[+A],意味着支持泛型A的子类集合向A进行赋值。 在这个例子里是List的是支持协变的。

class C[-A]{…} C是contrvariant

[-T],contravariant,类似(? supers T)

if T is a subtype of type S,this would imply that Queue[S] is a subtype of Queue[T]

只能用T的父类来替换T。是逆里氏替换原则。 在 scala.actors.OutputChannel 这个trait是一个逆变的类型。

trait OutputChannel[-Msg] {  
......  
对于OutputChannel[String],支持的操作就是输出一个string,同样OutputChannel[AnyRef]也一定可以支持输出一个string,因为它支持输出任意一个AnyRef(它要求的比OutputChannel[String]少) 。
 
 
但反过来就不行,OutputChannel[String]只能输出String,显然不能替换OutputChannel[AnyRef]

class C[A] {…} C是nonvariant(默认)


说明:以上是针对Scala-2.10.x版本的介绍

总结:

1.协变 [+T],即可以用T和T的子类来替换T,里氏替换原则。
2.不变 不支持T的子类或者父类,只知支持T本身。
3.逆变 [-T],类似(? supers T) 只能用T的父类来替换T。是逆里氏替换原则。
4.上界: 只允许T的超类U来替换T。 [U >: T]
5.下界: 只允许T的子类U来替代T。 [U <: T]


参考:

  1. https://stackoverflow.com/questions/26338964/what-is-the-difference-between-classoft-and-classt
  2. https://stackoverflow.com/questions/1135248/scala-equivalent-of-java-java-lang-classt-object
  3. https://hongjiang.info/scala-type-system-classof-and-getclass/
  4. http://oopsoutofmemory.github.io/scala/2014/11/19/scala-xie-bian-ni-bian-shang-jie-xia-jie-----li-jie-pian/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读