簡體   English   中英

Java 中的通配符,用於從相同 class 繼承的類

[英]WildCard in Java for classes that inherit from same class

在 Java 中有下一個類:

class A {
}
class B extends A {
}
class C extends A {
}

class ClassMethods {
    A method1(ArrayList<? extends A> list) {
        return list.get(1);
    }
    void method2(ArrayList<?> list, A el) {
        list.add(el);
    }

    void method3(A elem) {
        ArrayList<A> listA = new ArrayList<A>();
        listA.add(new A()); listA.add(new A());
        ArrayList<B> listB = new ArrayList<B>();
        listA.add(new B()); listB.add(new B());
        ArrayList<C> listC = new ArrayList<C>();
        listC.add(new C()); listC.add(new C());

        this.method1(listA);
        this.method1(listB);
        this.method1(listC);

        this.method2(listA, elem);
        this.method2(listB, elem);
        this.method2(listC, elem);
    }
}

有什么方法可以讓method2工作嗎? 無需超載。 因為我們寫在列表中,我們可能需要一個“?super x”說明符。 但例如,“超級 B”不適用於 C class。 所以我認為讓它工作的唯一可能性是讓一個帶有“?super B”和一個帶有“?super C”的重載。 我只能更改它的“<...>”部分,這就是問題的提出方式,並解釋如果它不能完成。

假設AObjectBString ,您是否希望能夠獲取List<String> strsObject item並調用strs.add(item)

您可以做的最接近的事情是 dd 類型參數。

<T> void method2(ArrayList<? super T> list, T el) {
    list.add(el);
}

但這是錯誤的方法。

如果您嘗試內聯method2 ,您將更直接地看到錯誤。

    listA.add(elem);
    listB.add(elem); // No chance.
    listC.add(elem); // No chance.
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM