返回泛型方法的类型

时间:2014-12-09 14:37:21

标签: java generics methods return-type

这些代码都不会编译。 我想了解为什么以及如何解决这个问题。这是简化的,方法签名由框架给出。我想提供一个可以用'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

2 个答案:

答案 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))并且您返回的列表是可修改的。