繁体   English   中英

转换清单 <Staging<Importable> &gt;列出 <Staging<ImportableImpl> &gt;使用Java 8流

[英]transform List<Staging<Importable>> to List<Staging<ImportableImpl>> with java 8 stream

假设我有一个名为Importable的接口,该接口具有多个实现,其中一个就是ImportableImpl

我有一个Staging类的列表,该类具有通用类型: Importable

通过Java 8流,我想转换列表:

List<Staging<Importable>> list1

到列表:

List<Staging<ImportableImpl>> list2

我已经确定列表list1Staging<ImportableImpl>的列表,因此不会发生ClassCastException 我不知道Java是否授权使用泛型类型进行这种转换。

我想尝试这样的事情:

list1.stream()
   .map(Staging::getImportable) // retrieve generic type
   .map(ImportableImpl.class::cast)
   .collect(Collectors.toList())

但是有了这个,我会得到一个List<ImportableImpl>而不是List<Staging<ImportableImpl>>

我真的不知道您尝试的目的是什么,但是无论第一个列表中的内容如何,​​都不允许您将List<Staging<Importable>>转换为List<Staging<ImportableImpl>> 这些类型是不可转换的。

做到这一点的唯一合理方法(尽管有警告)是:

@SuppressWarnings("unchecked") // if you are sure that all elements are ImportableImpl
list.stream().map(i -> (Staging<ImportableImpl>) i).collect(Collectors.toList());

list的类型为List<Staging<? extends Importable>> List<Staging<? extends Importable>> ,而不是List<Staging<Importable>>


当然,可以使用方法参考来编写它:

list.stream().map(Staging.class::<ImportableImpl>cast).collect(Collectors.toList());

在我看来,您必须创建一个新的登台对象...

该答案假定您可以使用new Staging<>(thing)创建一个Staging对象。 这是您需要的吗?

list1.stream()
   .map(s -> new Staging<ImportableImpl>(s.getImportable()))
   .collect(Collectors.toList())

如果我没错,那么基本上您只是想表达您的list1实际上已经是List<Staging<ImportableImpl>>类型的List<Staging<ImportableImpl>> 这样就丢弃了接口Importable提供的抽象。

在运行时,不存在任何泛型类型,您应该只能转换List<Staging<ImportableImpl>> list2 = (List) list1 这是未经检查的强制转换(使用原始表单作为中间体),并且将消除类型系统提供的一些安全性。 如果有人将类型Staging<AnotherImportableImpl>的对象添加到list1 ,则可能会中断。 使用像流一样的构造不会改变这种情况。 基本上,您只想告诉编译器您确定它无法检查的内容。

暂无
暂无

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

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