繁体   English   中英

如何将列表从子类泛型转换为父类泛型?

[英]How do I cast a List from a subclass generic to a parent class generic?

我正在修改开放式JDK以添加功能,但是我遇到了两次都没有好的解决方案。

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

问题:我想将List<JCStatement>转换为List<JCTree>

显然,一个类可以引用其扩展名之一,但是当我将其放在List上时,它只是不起作用。

我曾经使用过: (List<JCTree>)((List<?>)params)进行(List<JCTree>)((List<?>)params) ,但不能在ant上构建。 IDE给我以下警告:

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

因此,这必须以某种方式解决。

感谢您的帮助。

您无法进行此演员表转换。

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

如果您知道不会将任何元素添加到列表中-这样它将是类型安全的-然后Collections.unmodifiableList(List<? extends E>)将返回List<E>

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

这样的事情对您有用吗?

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);
    }
}

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

最简单的解决方案:

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

如果您真的很确定通过使用Raw Type进行转换,则可以这样做

List<Number> listA = new LinkedList<Number>();
List<Integer> listB = new LinkedList<Integer>();
listA = (List<Number>)(List) listB;

我无法想象自己曾经认为这是解决问题的好方法,但是它将满足您的要求,并且在编译时间泛型时有一些令人烦恼的限制:)

对于不安全的演员表,总会有警告,因为您所做的实际上是不安全的。 编译器无法使其变得安全,您必须自己确保这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM