2009-06-21 62 views
3

我已經定義,像這樣一類:無法調用泛型方法使用通配符

public class Test { 
    static <T> List<Class<T>> filter(List<Class<T>> input) { 
     // code here 
    } 

    public static void main(String[] args) { 
     List<Class<? extends Throwable>> list = 
      new ArrayList<Class<? extends Throwable>>(); 
     filter(list); 
    } 
} 

mainfilter方法調用提供了以下編譯錯誤:

The method filter(List<Class<T>>) in the type Test is not applicable for the 
arguments (List<Class<? extends Throwable>>) 

我不明白爲什麼<T>不綁定到<? extends Throwable>。有沒有可以幫助我的泛型大師?

回答

4

我相信這裏的問題是,有沒有類型?會做。

試想,如果我們爲了簡單,更換ClassAtomicReference

static <T> void filter(List<AtomicReference<T>> input) { 
    T value = input.get(0).get(); 
    input.get(1).set(value); 
} 

如果input由一個AtomicReference<Integer>和一個AtomicReference<String>,我們就麻煩了。

該指針的指針中多態性的存在潛在的問題是困難的。如果沒有泛型,我們可以揮手。用泛型我們需要實際上意味着什麼。

4

啊,通用簽名的樂趣。

static <T> List<Class<T>> filter(List<Class<? extends T>> input) { 
    // code here 
} 

至於究竟爲什麼,我不知道:

您可以通過聲明參數作爲解決它。通過嘗試各種事情來解決泛型編譯問題太多,直到紅線消失。不令人滿意。

+1

魔法門值得一看http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html – akarnokd 2009-06-21 21:47:19

+0

這調用方法(當修正錯誤,雖然我不不明白爲什麼),但現在我在方法裏面有一個錯誤。基本上,我有一個`列表>`保存結果,我不能條目,將其添加因爲`類`無法轉換爲`類`。至少,這對我來說很有意義。我改變該方法返回`列表<類>`,以及,那編譯。這很奇怪,但它的工作原理。 – 2009-06-21 21:56:29

0

,你也可以寫主要如下:

public static void main(String[] args) { 
    List<Class<Throwable>> list = 
     new ArrayList<Class<Throwable>>(); 
    filter(list); 
}