我有這樣的靜態方法泛型和靜態方法
public static List<? extends A> myMethod(List<? extends A> a) {
// …
}
這我使用
List<A> oldAList;
List<A> newAList = (List<A>) MyClass.myMethod(oldAList);
這讓因爲未選中強制轉換爲List<A>
的警告呼叫。有什麼方法可以避免演員陣容?
我有這樣的靜態方法泛型和靜態方法
public static List<? extends A> myMethod(List<? extends A> a) {
// …
}
這我使用
List<A> oldAList;
List<A> newAList = (List<A>) MyClass.myMethod(oldAList);
這讓因爲未選中強制轉換爲List<A>
的警告呼叫。有什麼方法可以避免演員陣容?
您需要定義返回的類型與參數匹配(並延伸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);
輝煌!謝謝 – Michael
這可能有點挑剔,但是你在使用中有一個語法錯誤,使用list1 = –
你它鑄造於母公司A
,如果你想避免這種情況,然後改變你的返回類型myMethod
:
public static List<T> myMethod(List<T> a) {
// …
}
如果定義:
public static <T extends A> List<T> myMethod(List<T> a) {
// …
}
然後可以調用:
列表= MyClass.myMethod(列表A){}
它通用方法,是nt呢?
日爾卡
這是可以如何避免與靜態方法鑄造:
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);
什麼是oldAList定義爲? newAList?泛型的要點是避免投射,但你需要提供更多的細節。 – Mikezx6r
謝謝 - 更新了代碼 – Michael