名单<? 扩展MyType>

我有一个关于generics的Java问题。 我宣布了一个通用列表:

List<? extends MyType> listOfMyType; 

然后在一些方法中,我尝试实例化并添加项目到列表中:

 listOfMyType = new ArrayList<MyType>(); listOfMyType.add(myTypeInstance); 

myTypeInstance只是MyTypetypes的对象; 它不会编译。 它说:

该方法添加(捕获#3 – ?扩展MyType)typesList <capture#3-of? 扩展MyType>不适用于参数(MyType)

任何想法?

你不能用延伸做“放”。 看一下generics – 获取和放置规则 。

考虑:

 class MySubType extends MyType { } List<MySubType> subtypeList = new ArrayList<MySubType>(); List<? extends MyType> list = subtypeList; list.add(new MyType()); MySubType sub = subtypeList.get(0); 

sub现在包含一个MyType ,这是非常错误的。

你应该不需要在你的情况下使用通配符捕获语法,只需声明

 List<MyType> listOfMytype; 

应该够了。 如果你想知道为什么, Javagenerics教程已经超过了你想知道Javagenerics的深奥的疯狂。 第20页解决您的具体情况。

至于为什么添加通配符捕获不起作用,这是因为编译器无法确定每一种情况下MyType的子类是什么,所以编译器会发出一个错误。

这里有一个类似的线程: 如何将元素添加到通配符generics集合中?

要了解generics如何工作,请查看此示例:

  List<SubFoo> sfoo = new ArrayList<SubFoo>(); List<Foo> foo; List<? extends Foo> tmp; tmp = sfoo; foo = (List<Foo>) tmp; 

事情是,这不是为本地/成员variablesdevise的,而是为函数签名,这就是为什么它是屁股后面。

我不知道这是否真的能帮到你,但是这是我在调用Spring框架的一个通用方法的时候必须使用的,并且还想返回一个通用列表:

 public <T> List<T> findAll(String tableName,Class<?> table) { String sql = "SELECT * FROM "+ tableName ; List<?> entities = getSimpleJdbcTemplate().query(sql, ParameterizedBeanPropertyRowMapper.newInstance(table)); return (List<T>) entities; } 

似乎参数化需要你使用? login列表以接收结果,然后将列表转换为预期的返回types。

Iam依然被generics所迷惑…