我想添加元素扩展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是错误。因为我不能添加其他类型。我想,但我不知道提及它及其错误!
如何通过方法调用添加项目?
答案 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;