泛型和静态方法

时间:2012-12-17 15:58:44

标签: java generics static-methods

我有这种静态方法

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

我正在使用

进行通话
List<A> oldAList;
List<A> newAList = (List<A>) MyClass.myMethod(oldAList);

由于未经检查的强制转换为List<A>,因此会发出警告。有没有办法避免演员?

4 个答案:

答案 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);