泛型簡(jiǎn)單總結(jié)

為了方便理解首先先創(chuàng)建3個(gè)類

public class A {
        public void printA() {

        }
    }

    public class B extends A {
        public void printB() {

        }
    }

    public class C extends B {
        public void printC() {

        }
    }

 public class GenericHolder<T> {
        T t;

        public void putItem(T item) {
            t = item;
        }

        public T getItem() {
            return t;
        }

    }

如果希望只取出,不插入,或者是方法的返回值是泛型參數(shù)沒(méi)有 就使用? extends B
也叫做上邊界通配符,協(xié)變

       GenericHolder<? extends B> holder1 = new GenericHolder<>();
        A a = new A();
        B b = new B();
        C c = new C();

        holder1.putItem(a);//編譯錯(cuò)誤
        holder1.putItem(b);//編譯錯(cuò)誤
        holder1.putItem(c);//編譯錯(cuò)誤


        A a1 = holder1.getItem();
        B b1 = holder1.getItem();
        C c1 = holder1.getItem();//編譯錯(cuò)誤
        val holder1:GenericHolder<out B> = GenericHolder()
        val a = A()
        val b = B()
        val c = C()
        holder1.putItem(a)//編譯錯(cuò)誤
        holder1.putItem(b)//編譯錯(cuò)誤
        holder1.putItem(c)//編譯錯(cuò)誤

        val a1: A? = holder1.item
        val b1: B? = holder1.item
        val c1: C? = holder1.item//編譯錯(cuò)誤

如果希望只插入,不取出,或者是方法的參數(shù)是泛型返回值沒(méi)有 就使用? super B
也叫做下邊界通配符,逆變

      GenericHolder<? super B> holder2 = new GenericHolder<>();
        A a = new A();
        B b = new B();
        C c = new C();

        holder2.putItem(a);//編譯錯(cuò)誤
        holder2.putItem(b);
        holder2.putItem(c);


        A a1 = holder2.getItem();//編譯錯(cuò)誤
        B b1 = holder2.getItem();//編譯錯(cuò)誤
        C c1 = holder2.getItem();//編譯錯(cuò)誤
        val holder2:GenericHolder<in B> = GenericHolder()
        val a = A()
        val b = B()
        val c = C()
         holder2.putItem(a)/編譯錯(cuò)誤
        holder2.putItem(b)
        holder2.putItem(c)

        val a1: A? = holder1.item  //編譯錯(cuò)誤
        val b1: B? = holder1.item / /編譯錯(cuò)誤
        val c1: C? = holder1.item //編譯錯(cuò)誤

補(bǔ)充
kotlin中的*
MutableList<*> 表示的是 MutableList<out Any?>
Kotlin 中可以用UnsafeVariance注解打破編譯器對(duì)in out的限制 但同時(shí)也會(huì)失去運(yùn)行時(shí)的狀態(tài)確認(rèn),參考 collections.kt

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容