![](/img/trans.png)
[英]Java Generics Wildcarding for a single param with multiple class types
[英]Java wildcarding with multiple types in variable
我知道在方法和類的情況下可以通配多種類型,但是變量呢? 例如,我是否可以要求ArrayList僅接受實現兩個不在同一類型層次結構中的兩個不同接口的元素? 請參閱下面的代碼以了解我要執行的操作。
import java.util.ArrayList;
interface A {}
interface B{}
interface AB extends A, B{}
class D <T extends A & B> { //This works but this is a class
T variable;
}
public class C {
ArrayList<AB> myList1 = new ArrayList<AB>(); // compiles
ArrayList<? extends AB> myList3 = new ArrayList<AB>(); //compiles
//The following does not compile.
ArrayList<? extends A & B> myList4 = new ArrayList<AB>();
//This works but this is a method:
public static <T extends A & B> T someMethod(ArrayList<? extends T> list) {
return null;
}
}
是:
class C<T extends A & B> {
ArrayList<T> field;
public <T2 extends A & B> void method() {
ArrayList<T2> localVar;
}
}
您必須在使用它的范圍之外為通用“類型”定義一個別名,這看起來有些奇怪,但是它可以工作。 我發現用該方法最容易看到:方法聲明中從未使用過T2
。 它僅在方法內部使用。
不幸的是,這些內部類型限制以這種方式成為了公共API的一部分,但這是我知道實現此工作的唯一方法。
如果您不希望這樣做,請在您的示例中嘗試一個內部專用接口( AB
)。
Java不支持類的多重繼承-一個類只能擴展一個類(盡管一個類可以實現多個接口)。 因此,我相信
ArrayList<? extends A & B>
不起作用。
解決方案是創建一個同時擴展A和B的超級類型,然后將該類型傳遞給您的方法。 就像是
inteface C extends A,B{}
ArrayList<? extends C>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.