例如,假设您有两个类:
public class TestA {} public class TestB extends TestA{}
我有一个返回 List<TestA> 我想将列表中的所有对象 TestB 所以我最终得到了一个 List<TestB> .
List<TestA>
TestB
List<TestB>
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;
对我来说似乎很好。
zaq34kh617#
你可以用 selectInstances 方法。这将涉及到创建一个新的集合,但因此将不会像使用铸造的公认解决方案那样有效。
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集合的提交者。
StringBuffer
17条答案
按热度按时间khbbv19g16#
问题是如果您的方法包含testb,那么它不会返回testa列表,那么如果它的类型正确呢?然后这个演员:
就像你希望的那样工作(eclipse警告你一个未检查的cast,这正是你正在做的,所以meh)。你能用这个来解决你的问题吗?实际上你可以因为这个:
正是你想要的,对吧?或者确切地说:
对我来说似乎很好。
zaq34kh617#
你可以用
selectInstances
方法。这将涉及到创建一个新的集合,但因此将不会像使用铸造的公认解决方案那样有效。我包括在内
StringBuffer
在示例中显示selectInstances
如果集合中包含混合类型,则不仅会降级该类型,还会进行筛选。注意:我是eclipse集合的提交者。