如何在ArrayList中添加元素<! - ?通过方法扩展SomeType - >

时间:2014-04-30 08:25:32

标签: java generics arraylist

我想添加元素扩展Type到ArrayList。

ArrayList<? extends Type> 

我定义了一个方法如下

public <T extends Type> void addItem(T itemToAdd, Class<?> classType) {
    ArrayList<? extends Type> allItems = getAllItems(classType);
    allItems.add(itemToAdd);
}

T itemToAdd是错误。因为我不能添加其他类型。我想,但我不知道提及它及其错误!

如何通过方法调用添加项目?

3 个答案:

答案 0 :(得分:2)

考虑一下您的定义:ArrayList<? extends Type>。它表示每个元素的列表扩展Type。这并不意味着它们中的每一个都是T类型itemToAdd。要使此代码编译,您必须确保这一事实,即在所有相关位置使用T

public <T extends Type> void addItem(T itemToAdd, Class<T> classType) {
    List<T> allItems = getAllItems(classType);
    allItems.add(itemToAdd);
}

这可能意味着您应该将getAllItem()的定义更改为

public <T extends Type> List<T> getAllItems(Class<T> classType)

顺便说一句,请注意我已将ArrayList更改为List。虽然它不属于主题但是避免在赋值运算符的左侧使用具体类,作为方法的返回值和方法参数。

答案 1 :(得分:0)

如果为List定义,则所有对象必须具有相同的类型

如果要插入多个类定义的简单List,则可以插入对象extends

示例:

List<Type> list = gellAllItems(class);
list.add(T);

答案 2 :(得分:0)

我不确定您声明getAllItems的返回值,但是您无法将itemToAdd类型T extends Type放入ArrayList<? extends Type>。元素的类型可以是不匹配的(虽然两者都是Type的派生类,但是不同类型),因此ArrayList应声明为

ArrayList<? super Type> allItems;

可以保证itmeToAdd可以放入ArrayList,或只是:

ArrayList<Type> allItems;