簡體   English   中英

Java通配符在變量中具有多種類型

[英]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.

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