泛型
与Java一样,Koltin的类也有类型参数。例如:
class Box(t: T){
var value = t
}
常规来说,创建这样的类,需要提供具体的类型。例如:
val box: Box = Box(1)
当类型可以从构造参数或其他上下文中推断出时,可以忽略类型参数。上面的代码可以简化为:
val box = Box(1)
型变
Java类型系统中最复杂的其中一个部分就是通配符类型(Java泛型FAQ)。而Kotlin没有任何的通配符类型,它使用声明处变型和类型投影两种方式替代。
通配符 - 使用问号表示的类型参数,表示未知类型的类型约束方法。
首先,先思考为什么Java需要这些难以理解的通配符。Effective Java解释了这个问题,第28条:使用受限通配符来增加API灵活性。首先,Java中泛型为不可变类型,意味List不是List的子类型。为什么这样?如果List为可变量,List不会比Java的数组更好,并且下面的代码能够成功编译,但在运行时会引起异常。
// Java
List strs = new ArrayList();
List objs = strs; // 会引起错误,Java禁止这样使用。
objs.add(1); // Here we put an Integer into a list of Strings
String s = strs.get(0); // 类转换异常:无法将Integer转换为String
所以Java禁止这样做,目的是保证运行时安全。但会有一些影响。比如:Collection接口的addAll()方法,这个方法的签名是什么?我们直觉上会这样做:
// Java
interface Collection ... {
void addAll(Collection items);
}
考虑到运行时安全,我们无法做到像下面的简单操作。
// Java
void copyAll(Collection to, Collection from) {
to.addAll(from); // !!! Would not compile with the naive declaration of addAll:
// Collection is not a subtype of Collection
}
实际上,addAll()的方法签名是:
// Java
interface Collection ... {
void addAll(Collection
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?