Java 列表
我有一个关于泛型的Java问题。我宣布了一份通用清单:Java 列表,java,list,generics,bounded-wildcard,Java,List,Generics,Bounded Wildcard,我有一个关于泛型的Java问题。我宣布了一份通用清单: List<? extends MyType> listOfMyType; 然后在某种方法中,我尝试实例化并将项目添加到该列表中: listOfMyType = new ArrayList<MyType>(); listOfMyType.add(myTypeInstance); 其中myTypeInstance只是MyType类型的对象;它不会编译。它说: addcapture3的方法是什么?延伸 类型列表中的M
List<? extends MyType> listOfMyType;
然后在某种方法中,我尝试实例化并将项目添加到该列表中:
listOfMyType = new ArrayList<MyType>();
listOfMyType.add(myTypeInstance);
其中myTypeInstance只是MyType类型的对象;它不会编译。它说:
addcapture3的方法是什么?延伸
类型列表中的MyType不适用
对于参数MyType
有什么想法吗?你不能用extends做put。请看。在您的案例中不需要使用通配符捕获语法,只需声明
List<MyType> listOfMytype;
应该足够了。如果您想知道确切的原因,那么对于Java泛型的深奥疯狂,您永远都不想知道。第20页介绍了您的具体案例
至于为什么使用通配符捕获添加不起作用,这是因为编译器无法准确确定在每种情况下列表将是MyType的哪个子类,因此编译器会发出一个错误。请考虑:
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<SubFoo> sfoo = new ArrayList<SubFoo>();
List<Foo> foo;
List<? extends Foo> tmp;
tmp = sfoo;
foo = (List<Foo>) tmp;
问题是,这不是为局部/成员变量设计的,而是为函数签名设计的,这就是为什么它如此落后。我不知道这是否真的能帮助你,但这是我在调用Spring Framework的通用方法并希望返回通用列表时必须使用的东西:
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;
}
看来参数化需要你使用?登录列表以接收结果,然后将列表强制转换为预期的返回类型
我仍然被仿制药迷住了 正如Josh Bloch所说:记住PECS:生产者延伸,消费者超级。由于listOfMyType是您要添加到它的使用者,所以super是有效的,extends不是。迂腐点:您可以将null与extends放在一起。此外,您还可以捕获类型并放置以前得到的引用。不要通过字符串连接创建SQL查询-请参阅SQL注入如果类Bar扩展了类Foo,而类Baz具有泛型,那么Baz waldo=新Baz将无法工作,因为Baz不是Baz的子类,Bar是Foo的子类。子分类不适用于泛型。ArrayList flob=新的ArrayList将不起作用。简单地说,继承不适用于泛型。既然你做了清单