[英]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
我已经确定列表list1
是Staging<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.