泛型
Kotlin支持声明处型变和使用处型变,Java只支持使用处型变
##1.1、定义类、接口泛型 ##
open class Fruit<T>{
var name:String
open var info:T?
constructor(name: String,info:T){
this.name=name
this.info=info
}
}
class Apple<T>(name:String,info:T) : Fruit<T>(name,info) {
}
继承超类,如果要延长超类自定义泛型类型可以写成上面那样;否则,定义子类时必须为父类泛型传入实际类型
class Apple<K>:Fruit<String>{
var K weight;
constuctor(weight:K){
this.weight=weight;
}
}
Java中可以写成这样:
Apple<String> apple=new Apple<>();
但是写成这样就是错误的:
Apple<Sting> apple=new Apple();
但是在Kotlin中支持这种写法,可以省略右边的尖括号;
在创建泛型对象时,kotlin要求:必须为泛型类型明确指定类型,不管是显示指定,还是系统推断:
Apple apple=new Apple()
这种写法在java中没有问题,kotlin中会报错,因为不知道K是何种数据类型
和java还有一点不同的是:
定义子类时,必须为超类的泛型类型变量指定实际类型,不能写成:
class Apple:Fruit{
}
1.2、通配符上、下限
<? extends 上限类>:意味着取出(out)对象是安全的,但传入(in)对象是不安全的;Kotlin中称之为协变
Collection<? extends Number> lsit=new ArrayList <>();<