2

我有这个静态方法

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

我正在使用

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

由于未经检查的强制转换为List<A>. 有什么办法可以避免演员吗?

4

4 回答 4

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);
于 2012-12-17T16:03:19.303 回答
0

您正在将其转换为父级A,如果您想避免这种情况,请更改您的返回类型myMethod

public static List<T> myMethod(List<T> a) {
  // …
}
于 2012-12-17T16:01:35.487 回答
0

如果你定义:

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

然后你可以打电话:

List = MyClass.myMethod(List a){}

它是通用方法,不是吗?

吉尔卡

于 2012-12-17T16:44:06.803 回答
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 时,不需要强制转换。另一方面,如果您只想摆脱警告,则可以使用“ @SuppressWarning ”注释。检查此链接以获取更多信息Java 中的 SuppressWarnings(“未选中”)是什么?

这是@SuppressWarnings ("unchecked")的简单示例:

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

@SuppressWarnings ("unchecked")
newAList = (List<A>) MyClass.myMethod(oldAList);
于 2012-12-18T09:08:53.130 回答