如何将子类泛型中的List转换为父类泛型?

时间:2012-05-29 16:21:23

标签: java list openjdk downcast

我正在修改打开的JDK以添加功能,而且我遇到了两次没有很好的解决方案。

有一个名为JCStatement的类,它扩展了JCTree

问题:我想将List<JCStatement>投射到List<JCTree>

很明显,一个类可以引用它的一个扩展,但是当我在List上使用它时,它就不起作用了。

我使用:(List<JCTree>)((List<?>)params)进行投射,这有效,但不是以蚂蚁为基础。 IDE给了我以下警告:

Type safety: Unchecked cast from List<capture#1-of ?> to List<JCTree>

所以这必须以某种方式解决。

我感谢任何帮助。

5 个答案:

答案 0 :(得分:2)

你无法进行此演员。

如果将List<JCStatement>强制转换为List<JCTree>,然后将JCTree(非JCStatement)对象添加到该列表,会发生什么?它打破了List<JCStatement>类型的安全性。

答案 1 :(得分:2)

如果您知道不会向列表添加任何元素 - 因此它将是类型安全的 - 那么Collections.unmodifiableList(List<? extends E>)将返回List<E>

这完全是类型安全且合法的,因为它强制保证您永远不会将非法元素添加到列表中,并且它由JDK提供。

答案 2 :(得分:1)

这样的事情对你有用吗?

import java.util.ArrayList;
import java.util.List;

class A {
}

class B extends A {
}

class C extends A {
}

public class Program {
    public static void foo(List<? extends A> list) {
    }

    public static void main(String[] args) {
        List<A> listA = new ArrayList<A>();
        List<B> listB = new ArrayList<B>();
        List<C> listC = new ArrayList<C>();
        List<? extends A> listX = (List<? extends A>) listB;
        List<? extends A> listY = (List<? extends A>) listC;

        foo(listA);
        foo(listB);
        foo(listC);
        foo(listX);
        foo(listY);
    }
}

答案 3 :(得分:1)

这似乎是List或泛型类型集合的一般问题。

最简单的解决方案:

ListBuffer<JCTree> ls = new ListBuffer<JCTree>();
for(JCVariableDecl v : params){ ls.append(v); }
return ls.toList();

答案 4 :(得分:0)

如果您真的确定通过强制转换原始类型

确保它是安全的,那么您可以这样做
List<Number> listA = new LinkedList<Number>();
List<Integer> listB = new LinkedList<Integer>();
listA = (List<Number>)(List) listB;

我无法想象自己曾经认为这是一个很好的解决问题的方法,但它会做你想要的,并且编译时间泛型有一些恼人的限制:)

对于不安全的演员阵容总会有警告,因为你所做的事实上是不安全的。编译器无法使其安全,您必须自己确定。