使用泛型类型转换问题实现和接口的集合

时间:2011-07-27 09:22:21

标签: java generics interface

假设:

interface ViewableDTO {//methods here}

class PersonDTO implements ViewableDTO {//implementation here}

这很好用:

PersonDTO p = new PersonDTO();
ViewableDTO v = p; //works

为什么这不起作用:

List<PersonDTO> plist = getPersonDtoList();
List<ViewableDTO> vlist = plist; //compilation error
List<ViewableDTO> vlist = (List<ViewableDTO>)plist; //compilation error

我的解决方案是:

List<ViewableDTO> vlist = new ArrayList<ViewableDTO>();
vlist.addAll(plist);

我的问题是,这是唯一/最好的方法吗?

2 个答案:

答案 0 :(得分:3)

考虑使用List<ViewableDTO>可以做些什么。您可以添加实现ViewableDTO的类型的任何对象。你真的想要这个编译吗?

List<PersonDTO> plist = getPersonDtoList();
List<ViewableDTO> vlist = plist;
vlist.add(new OtherDTO());

不 - 在该表单中列出 out 的列表是唯一安全的,所以你使用这样的东西:

List<PersonDTO> plist = getPersonDtoList();
List<? extends ViewableDTO> vlist = plist;

有关详细信息,请参阅Java Generics FAQ section on Wildcard Instantiations

答案 1 :(得分:0)

这将有效

List<? extends ViewableDTO> vlist = plist;

请查看What is PECS (Producer Extends Consumer Super)?