您当前的位置: 首页 >  kotlin

xiangzhihong8

暂无认证

  • 0浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Kotlin基础之泛型

xiangzhihong8 发布时间:2017-12-25 15:45:09 ,浏览量:0

泛型

与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            
关注
打赏
1482932726
查看更多评论
0.0421s