我有这种静态方法
public static List<? extends A> myMethod(List<? extends A> a) {
// …
}
我正在使用
进行通话List<A> oldAList;
List<A> newAList = (List<A>) MyClass.myMethod(oldAList);
由于未经检查的强制转换为List<A>
,因此会发出警告。有没有办法避免演员?
答案 0 :(得分: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);
答案 1 :(得分:0)
您要将其投放到父A
,如果您想避免这种情况,请更改myMethod
的返回类型:
public static List<T> myMethod(List<T> a) {
// …
}
答案 2 :(得分:0)
如果你定义:
public static <T extends A> List<T> myMethod(List<T> a) {
// …
}
然后你可以打电话:
List = MyClass.myMethod(List a){}
这是通用的方法,不是吗?
日尔卡
答案 3 :(得分: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);
}
}
在上面的代码中,B扩展A.当newList变量被定义为没有泛型的List或具有通配符类型的List(List&lt;?&gt;)时,不需要强制转换。另一方面,如果您只想摆脱警告,可以使用“ @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);