【问题标题】:Construct List<T> from Enumeration<? extends T>从 Enumeration<? 构造 List<T>扩展 T>
【发布时间】:2014-10-20 10:46:57
【问题描述】:

如何从Enumeration&lt;? extends T&gt; 构造List&lt;T&gt;

我找到的最好的方法是这个

Enumeration<? extends T> toBeConverted;
List<T> = new ArrayList<>(Collections.list(toBeConverted));

但这会创建两个List(一个在Collections.list 方法中,另一个在ArrayList 的构造函数中)。有什么办法可以避免这个临时副本?

(其他解决方案是:

List<T> list = new ArrayList<T>;
while (toBeConverted.hasMoreElements) { list.add(toBeConverted.nextElement()); }

但我认为这太冗长了......如果可能的话,我想要一个带有构造函数的解决方案)

【问题讨论】:

    标签: java templates


    【解决方案1】:

    方法Collections.list 新建ArrayList。

    public static <T> ArrayList<T> list(Enumeration<T> e) {
        ArrayList<T> l = new ArrayList<>();
        while (e.hasMoreElements())
            l.add(e.nextElement());
        return l;
    }
    

    您可以只调用Collections.list 方法而不使用构造函数。

    Enumeration<? extends T> toBeConverted;
    List<T> = (List<T>) Collections.list(toBeConverted);
    

    【讨论】:

    • 这显然是我第一次尝试,但 List&lt;T&gt; = Collections.list(toBeConverted); 无法编译。
    • 演员 (List &lt;T&gt;) 总是安全的吗?或者它可以抛出一个ClassCastException
    • 它不会抛出ClassCastException,因为类型擦除。
    • 列表 extends T> 强制转换为 List 应该总是安全的。我找不到证据,但在 JDK cast 中这样使用了很多次。
    • 好吧,只是它破坏了编译器阻止您将错误类型的对象放入列表中的努力。一般来说,List&lt;? extends T&gt; 不应该是List&lt;T&gt;,所以它在编译时是不安全的。但是在运行时,泛型消失了;所以如果你可以告诉编译器忽略你的错误,事情最终可能会正常。
    猜你喜欢
    • 2012-12-01
    • 2011-06-27
    • 2016-03-19
    • 2011-10-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多