Scala的协变和逆变上界与下界
1. 引子:
为了弄懂scala中协变和逆变这两个概念,查阅了不少资料,但是还是要自己总结一下,会记得比较深刻。
那就从java和scala的对比说起吧。
java中:
如果你很理解java的泛型,就会知道:比如给定一个类B,和他的父类A。
那么用多态, A a = new B 编译器是允许的。
但是如果泛型B的集合直接赋给父类A的集合。List<A> aList = new ArrayList<B>();
举个简单的例子:
Object s = "abc";
List<Object> objects = new ArrayList<String>();
编译不通过,编译器提示:
Type mismatch: cannot convert from ArrayList<String> to List<Object>
scala中:
我们知道sting是AnyRef的子类。直接赋值是可以的。
如果是将string的集合赋值给AnyRef的集合,在scala中也是可以的。
scala> val s:AnyRef = "abc"
s: AnyRef = abc
scala&g