kotlin 泛型之协变(out)和逆变(in)(2)

二、kotlin中的in和out对比java

2.1 kotlin中的in和out

kotlin代码如下:

/**
 * DESC   :
 */
const val KtBaseInOrOutTest02_TAG = "KtBaseInOrOutTest02"

/**
 * in T 和 out T 声明处指定关系, 声明处泛型 这个是java没有的功能
 * 整个SetClass 里面的所有成员 泛型关系, 只能修改,不能获取
 */
class SetClass {
    fun set1(item: T) {
        Log.d(KtBaseInOrOutTest02_TAG, "set1==>你要设置的item值是"+item)
    }

    //增加in后,不能给外界读取,编译报错
    /*fun get1() : T? {
        return null
    }*/
}

class GetClass(_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()
        //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:声明上界,表示参数化的类型可能是所指定的 T 类型,
     * 或者是此类型的任意子类型。最终子类型:未知
     */
    public void testOut() {
        List list = new ArrayList();
        //父类 CharSequence, 子类String,不能将String赋值给CharSequence,编译报错
//        List list2 = new ArrayList();

        // ? extends T就相当于kt中的out,所以才可以泛型子类对象 赋值给 泛型父类对象
        // ? extends CharSequence这样写法就不会报错了
        List list3 = new ArrayList();

        //kt中out:泛型具体处的子类对象 可以赋值给 泛型声明处的父类对象
        //kt 协变:父类泛型声明处 可以接收 泛型子类具体的对象

    }

    /**
     * List:声明下界,表示参数化的类型可能是所指定的 T 类型,
     * 或者是此类型的任意父类型。最终父类型:已知——Object。
     */
    public void testIn() {
        //父类 CharSequence, 子类String
        List list = new ArrayList();

        //父类CharSequence是不可以赋值给子类String的
//        List list2 = new ArrayList();

        //使用 ? super T,相当于kt中的in,所以才可以 泛型父类具体处的对象  赋值给  泛型子类声明处的对象
        //使用in T, 泛型父类具体处的对象  可以赋值给  泛型子类声明处的对象
        List list3 = new ArrayList();

        //kt 逆变:子类泛型声明处对象  可以接收 父类泛型具体处对象
    }
}

你可能感兴趣的:(kotlin 泛型之协变(out)和逆变(in)(2))