【问题标题】:Is there a way to change the generic type of an ArrayList without creating a new temporary ArrayList?有没有办法在不创建新的临时 ArrayList 的情况下更改 ArrayList 的泛型类型?
【发布时间】:2019-08-13 17:55:30
【问题描述】:

我们能否在创建 ArrayList<?>() 之后更改其通用参数类型,例如从 Arraylist<Integer>() 更改为 ArrayList<String>,而不使用临时 ArrayList 来保存元素,然后将它们复制回新的列表?

【问题讨论】:

  • 为什么不直接使用ArrayList<Object>()?但更好的是,你为什么需要做这样的事情?
  • 是的,有比这样做更简单的替代方案和设计选择。我只是想知道这是否可能。感谢您的回复。
  • 根据您对临时 ArrayList 的含义,您可以使用一些不错的 lambda 来映射/转换它们。

标签: java arraylist collections


【解决方案1】:

如果这两种类型之间存在有效的转换,这是可能的。例如:

List<Integer> ints = Arrays.asList(1,2,3,4,5,6);
List<Long> longs = ints.stream().map(val -> (Long) (long) (int) val).collect(Collectors.toList());
System.out.println(longs);

输出:

[1, 2, 3, 4, 5, 6]

这需要Integers 的列表,应用转换函数使它们中的每一个都成为Long,并将转换后的值收集到Longs 的列表中。

这个工作的原因在于转换功能: val -&gt; (Long) (long) (int) val。此函数接受Integer,将其拆箱为int,将其扩展为long,并将其装箱为Long。因此,该函数定义了从IntegerLong 的转换。这也适用于您知道类型的其他实例。例如,如果您有以下情况:

class A {}
class B extends A{}
List<A> as = Arrays.asList(new B(), new B());
List<B> bs = as.stream().map(val -> (B) val).collect(Collectors.toList());
System.out.println(bs);

它还将编译,并输出如下内容:

[B@681a9515, B@3af49f1c]

这样做的原因是,在转换函数 (val -&gt; (B) val) 中,您将 A 列表中的所有值转换为 B 类型。但是,如果您转换的值不是真正的 B 的实例,这将抛出 ClassCastException

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多