我有Bar扩展抽象类的类(可能还有许多其他类)AbstractFoo。将 的实例转换Bar为 时FooDTO,会检测到具体类。
但是,在将Bar实例集合转换为 的列表时FooDTO,会丢失具体的类信息,转换是在 的基础上进行的AbstractFoo。
这里出了什么问题?
public class CollectionGenericsNGTest {
public static abstract class AbstractFoo { }
public static class Bar extends AbstractFoo { }
public static class FooDTO {
final boolean isBar;
public FooDTO(AbstractFoo f) {
this.isBar = false;
}
public FooDTO(Bar b) {
this.isBar = true;
}
}
public static class FooDTOList {
List<FooDTO> list;
public FooDTOList(Collection<? extends AbstractFoo> source) {
list = source.stream()
.map(entry -> new FooDTO(entry))
.collect(Collectors.toList());
}
public List<FooDTO> getList() {
return list;
}
}
@Test
public void testDTO() {
Bar b = new Bar();
FooDTO f = new FooDTO(b);
assertTrue(f.isBar);
}
@Test
public void testDTO_abstract() {
AbstractFoo b = new Bar();
FooDTO f = new FooDTO(b);
assertTrue(f.isBar); // <-- fails, too
}
@Test
public void testDTOList() {
Bar b = new Bar();
List<Bar> collection = Arrays.asList(b);
FooDTOList list = new FooDTOList(collection);
FooDTO f = list.getList().get(0);
assertTrue(f.isBar); // <--- this fails!
}
}
HUX布斯
相关分类