如何将超类型列表转换为子类型列表?

bxgwgixi  于 2021-06-29  发布在  Java
关注(0)|答案(17)|浏览(311)

例如,假设您有两个类:

public class TestA {}
public class TestB extends TestA{}

我有一个返回 List<TestA> 我想将列表中的所有对象 TestB 所以我最终得到了一个 List<TestB> .

khbbv19g

khbbv19g16#

问题是如果您的方法包含testb,那么它不会返回testa列表,那么如果它的类型正确呢?然后这个演员:

class TestA{};
class TestB extends TestA{};
List<? extends TestA> listA;
List<TestB> listB = (List<TestB>) listA;

就像你希望的那样工作(eclipse警告你一个未检查的cast,这正是你正在做的,所以meh)。你能用这个来解决你的问题吗?实际上你可以因为这个:

List<TestA> badlist = null; // Actually contains TestBs, as specified
List<? extends TestA> talist = badlist;  // Umm, works
List<TextB> tblist = (List<TestB>)talist; // TADA!

正是你想要的,对吧?或者确切地说:

List<TestB> tblist = (List<TestB>)(List<? extends TestA>) badlist;

对我来说似乎很好。

zaq34kh6

zaq34kh617#

你可以用 selectInstances 方法。这将涉及到创建一个新的集合,但因此将不会像使用铸造的公认解决方案那样有效。

List<CharSequence> parent =
        Arrays.asList("1","2","3", new StringBuffer("4"));
List<String> strings =
        Lists.adapt(parent).selectInstancesOf(String.class);
Assert.assertEquals(Arrays.asList("1","2","3"), strings);

我包括在内 StringBuffer 在示例中显示 selectInstances 如果集合中包含混合类型,则不仅会降级该类型,还会进行筛选。
注意:我是eclipse集合的提交者。

相关问题