假设我有一个名为Importable的接口,它有多个实现,其中一个是ImportableImpl。
我有一个类Staging的列表,它有一个泛型类型:Importable。
通过java 8流,我想转换列表:
List<Staging<Importable>> list1一份清单:
List<Staging<ImportableImpl>> list2我已经确定list 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>>。
发布于 2016-12-02 16:41:17
我真的不知道您的尝试的目的是什么,但是您不允许将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<Importable>>。
当然,它可以用方法引用来编写:
list.stream().map(Staging.class::<ImportableImpl>cast).collect(Collectors.toList());发布于 2016-12-02 16:16:50
在我看来你必须创建一个新的分期对象..。
这个答案假设您可以使用Staging创建一个new Staging<>(thing)对象。这就是你需要的吗?
list1.stream()
.map(s -> new Staging<ImportableImpl>(s.getImportable()))
.collect(Collectors.toList())发布于 2016-12-02 16:55:16
如果我说得对,基本上只是想表达一下,您的list1实际上已经是List<Staging<ImportableImpl>>类型的列表。这样就抛弃了接口Importable提供的抽象。
在运行时,不存在任何泛型类型,您应该能够只转换List<Staging<ImportableImpl>> list2 = (List) list1。这是一个未检查的强制转换(将原始表单作为中间形式使用),并将删除类型系统提供的一些安全性。如果有人将Staging<AnotherImportableImpl>类型的对象添加到list1中,它可能会中断。使用像streams这样的花哨构造不会改变情况。基本上,您只想告诉编译器,您确信您知道一些它无法检查的内容。
https://stackoverflow.com/questions/40936301
复制相似问题