二、kotlin中的in和out对比java
2.1 kotlin中的in和out
kotlin代码如下:
/**
* DESC :
*/
const val KtBaseInOrOutTest02_TAG = "KtBaseInOrOutTest02"
/**
* in T 和 out T 声明处指定关系, 声明处泛型 这个是java没有的功能
* 整个SetClass 里面的所有成员 泛型关系, 只能修改,不能获取
*/
class SetClass<in T> {
fun set1(item: T) {
Log.d(KtBaseInOrOutTest02_TAG, "set1==>你要设置的item值是"+item)
}
//增加in后,不能给外界读取,编译报错
/*fun get1() : T? {
return null
}*/
}
class GetClass<out T>(_item : T) {
private var item = _item
//增加out后,不能给外界修改,只能读取,编译报错
/*fun set1(item : T) {
Log.d(KtBaseInOrOutTest02_TAG, "set1==>你要设置的item值是"+item)
}*/
fun get1() : T? {
return item
}
}
class KtBaseInOrOutTest02 {
fun testSetClass() {
val setClass = SetClass<String>()
//set1==>你要设置的item值是nihaoma
setClass.set1("nihaoma")
}
fun testGetClass() {
val getClass = GetClass("哈哈哈哈哈")
//testGetClass==>哈哈哈哈哈
Log.d(KtBaseInOrOutTest02_TAG, "testGetClass==>"+getClass.get1())
}
}
2.2
java代码如下:
/**
* DESC :
*/
public class JavaBaseInOrOutTest01 {
/**
* List<? extends T>:声明上界,表示参数化的类型可能是所指定的 T 类型,
* 或者是此类型的任意子类型。最终子类型:未知
*/
public void testOut() {
List<CharSequence> list = new ArrayList<CharSequence>();
//父类 CharSequence, 子类String,不能将String赋值给CharSequence,编译报错
// List<CharSequence> list2 = new ArrayList<String>();
// ? extends T就相当于kt中的out,所以才可以泛型子类对象 赋值给 泛型父类对象
// ? extends CharSequence这样写法就不会报错了
List<? extends CharSequence> list3 = new ArrayList<String>();
//kt中out:泛型具体处的子类对象 可以赋值给 泛型声明处的父类对象
//kt 协变:父类泛型声明处 可以接收 泛型子类具体的对象
}
/**
* List<? super T>:声明下界,表示参数化的类型可能是所指定的 T 类型,
* 或者是此类型的任意父类型。最终父类型:已知——Object。
*/
public void testIn() {
//父类 CharSequence, 子类String
List<CharSequence> list = new ArrayList<CharSequence>();
//父类CharSequence是不可以赋值给子类String的
// List<String> list2 = new ArrayList<CharSequence>();
//使用 ? super T,相当于kt中的in,所以才可以 泛型父类具体处的对象 赋值给 泛型子类声明处的对象
//使用in T, 泛型父类具体处的对象 可以赋值给 泛型子类声明处的对象
List<? super String> list3 = new ArrayList<CharSequence>();
//kt 逆变:子类泛型声明处对象 可以接收 父类泛型具体处对象
}
}
网友评论