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

我有一个关于泛型的Java问题。我宣布了一份通用清单:

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将不起作用。简单地说,继承不适用于泛型。既然你做了清单