首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用java 8流将List<Staging<Importable>>转换为List<Staging<ImportableImpl>>

用java 8流将List<Staging<Importable>>转换为List<Staging<ImportableImpl>>
EN

Stack Overflow用户
提问于 2016-12-02 16:01:44
回答 3查看 73关注 0票数 2

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

我有一个类Staging的列表,它有一个泛型类型:Importable

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

代码语言:javascript
复制
List<Staging<Importable>> list1

一份清单:

代码语言:javascript
复制
List<Staging<ImportableImpl>> list2

我已经确定list list1Staging<ImportableImpl>的列表,所以不会发生ClassCastException。我不知道java是否授权这种泛型类型的转换。

我想试试这样的东西:

代码语言:javascript
复制
list1.stream()
   .map(Staging::getImportable) // retrieve generic type
   .map(ImportableImpl.class::cast)
   .collect(Collectors.toList())

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-02 16:41:17

我真的不知道您的尝试的目的是什么,但是您不允许将List<Staging<Importable>>转换为List<Staging<ImportableImpl>>,而不管第一个列表中的是什么。这些类型是不可兑换的。

这样做的唯一合理方法(但有警告)是:

代码语言:javascript
复制
@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<Importable>>

当然,它可以用方法引用来编写:

代码语言:javascript
复制
list.stream().map(Staging.class::<ImportableImpl>cast).collect(Collectors.toList());
票数 4
EN

Stack Overflow用户

发布于 2016-12-02 16:16:50

在我看来你必须创建一个新的分期对象..。

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

代码语言:javascript
复制
list1.stream()
   .map(s -> new Staging<ImportableImpl>(s.getImportable()))
   .collect(Collectors.toList())
票数 0
EN

Stack Overflow用户

发布于 2016-12-02 16:55:16

如果我说得对,基本上只是想表达一下,您的list1实际上已经是List<Staging<ImportableImpl>>类型的列表。这样就抛弃了接口Importable提供的抽象。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40936301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档