这些代码都不会编译。 我想了解为什么以及如何解决这个问题。这是简化的,方法签名由框架给出。我想提供一个可以用'TableItem'的子类型覆盖的默认值。
add
处的错误:
public <TI extends TableItem> ArrayList<TI> getTable() {
ArrayList<TI> list = new ArrayList<TI>();
TableItem item = new TableItem();
list.add(item);
return list;
}
return
处的错误:
public <TI extends TableItem> ArrayList<TI> getTable() {
ArrayList<TableItem> list = new ArrayList<TableItem>();
TableItem item = new TableItem();
list.add(item);
return list;
}
修改
这对我有所帮助:Difference between <? super T> and <? extends T> in Java
答案 0 :(得分:2)
你的问题似乎与泛型有关。添加到泛型列表......
我通常会通过记住我在Effective Java中学到的助记符来推理这些东西:
PECS:生产者延伸,消费者超级
所以这意味着你的情况如下:由于方法getTable()中返回的列表是一个使用者(即你要添加到这个列表中),那么你应该将它声明为:
public <TI extends TableItem> ArrayList<? super TableItem> getTable() {
ArrayList<TableItem> list = new ArrayList<TableItem>();
TableItem item = new TableItem();
list.add(item);
return list;
}
答案 1 :(得分:0)
这是不可能的,就像你这样做。如果您真的希望用户能够定义一个类,有两种方法可以实现。一个人会提供课程:
public <TI extends TableItem> ArrayList<TI> getTable() {
return getTable(TableItem.class);
}
public <TI extends TableItem> ArrayList<TI> getTable(Class<TI> tiClass) {
ArrayList<TI> list = new ArrayList<TI>();
TableItem item = tiClass.getConstructor().newInstance(); //remember to catch exceptions here!
list.add(item);
return list;
}
或另一个是提供TableItem
对象的用户:
public <TI extends TableItem> ArrayList<TI> getTable() {
return getTable(new TableItem());
}
public <TI extends TableItem> ArrayList<TI> getTable(TI tiObject) {
ArrayList<TI> list = new ArrayList<TI>();
list.add(tiObject);
return list;
}
您确定要以这种方式构建程序吗?函数本身似乎是多余的(您只是创建一个列表),它可以缩短(Arrays.asList(object)
)并且您返回的列表是可修改的。