我有这个静态方法
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);
您正在将其转换为父级A
,如果您想避免这种情况,请更改您的返回类型myMethod
:
public static List<T> myMethod(List<T> a) {
// …
}
如果你定义:
public static <T extends A> List<T> myMethod(List<T> a) {
// …
}
然后你可以打电话:
List = MyClass.myMethod(List a){}
它是通用方法,不是吗?
吉尔卡
这是您可以避免使用静态方法进行强制转换的方法:
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);
}
}
在上面的代码中,B 扩展了 A。当 newList 变量被定义为不带泛型的 List 或带有通配符类型 (List< ? >) 的 List 时,不需要强制转换。另一方面,如果您只想摆脱警告,则可以使用“ @SuppressWarning ”注释。检查此链接以获取更多信息Java 中的 SuppressWarnings(“未选中”)是什么?
这是@SuppressWarnings ("unchecked")的简单示例:
public static List<? extends A> myMethod(List<? extends A> a) {
// …
}
@SuppressWarnings ("unchecked")
newAList = (List<A>) MyClass.myMethod(oldAList);