[英]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”的重載。 我只能更改它的“<...>”部分,這就是問題的提出方式,並解釋如果它不能完成。
假設A
是Object
而B
是String
,您是否希望能夠獲取List<String> strs
、 Object 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.