名单<? 扩展MyType>
我有一个关于generics的Java问题。 我宣布了一个通用列表:
List<? extends MyType> listOfMyType;
然后在一些方法中,我尝试实例化并添加项目到列表中:
listOfMyType = new ArrayList<MyType>(); listOfMyType.add(myTypeInstance);
myTypeInstance
只是MyType
types的对象; 它不会编译。 它说:
该方法添加(捕获#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所迷惑…