2012-12-17 153 views
2

我有這樣的靜態方法泛型和靜態方法

public static List<? extends A> myMethod(List<? extends A> a) { 
    // … 
} 

這我使用

List<A> oldAList; 
List<A> newAList = (List<A>) MyClass.myMethod(oldAList); 

這讓因爲未選中強制轉換爲List<A>的警告呼叫。有什麼方法可以避免演員陣容?

+0

什麼是oldAList定義爲? newAList?泛型的要點是避免投射,但你需要提供更多的細節。 – Mikezx6r

+0

謝謝 - 更新了代碼 – Michael

回答

9

您需要定義返回的類型與參數匹配(並延伸A)

public static <T extends A> List<T> myMethod(List<T> a) { 
    // … 
} 

然後,你可以寫

List<E> list1 = .... some list .... 
List<E> list2 = myMethod(list1); // assuming you have an import static or it's in the same class. 

List<E> list2 = SomeClass.myMethod(list1); 
+0

輝煌!謝謝 – Michael

+1

這可能有點挑剔,但是你在使用中有一個語法錯誤,使用list1 = –

0

你它鑄造於母公司A,如果你想避免這種情況,然後改變你的返回類型myMethod

public static List<T> myMethod(List<T> a) { 
    // … 
} 
0

如果定義:

public static <T extends A> List<T> myMethod(List<T> a) { 
// … 
} 

然後可以調用:

列表= MyClass.myMethod(列表A){}

它通用方法,是nt呢?

日爾卡

0

這是可以如何避免與靜態方法鑄造:

public class MyClass { 
    public static List<? extends A> myMethod(List<? extends A> a) { 
     return a; 
    } 

    public static void main(String[] args) { 
     List newList = new ArrayList<A>(); 
     List<?> newList2 = new ArrayList<A>(); 
     List<B> oldList = new ArrayList<B>(); 

     newList = MyClass.myMethod(oldList); 
     newList2 = MyClass.myMethod(oldList); 
    } 
} 

在上面的代碼中,當newList變量而沒有泛型或作爲與列表定義爲列表B延伸A.通配符類型(列表<?>)轉換不是必需的。另一方面,如果您只想擺脫警告,您可以使用'@SuppressWarning'註釋。檢查此鏈接獲取更多信息What is SuppressWarnings ("unchecked") in Java?

這裏是@SuppressWarnings( 「未登記」)簡單的例子:

public static List<? extends A> myMethod(List<? extends A> a) { 
    // … 
} 

@SuppressWarnings ("unchecked") 
newAList = (List<A>) MyClass.myMethod(oldAList);