在列表中正确使用泛型

时间:2015-05-19 10:17:57

标签: java list generics

我有以下问题,希望有人能解决这个问题。设置是我具有来自psql调用的不同实体类的列表。我有以下方法要应用于它们。我想提取对象的名称并将它们保存在一个数组中以供进一步使用。注意:我想要使用的每个类都有一个getName()方法。

private String[] getNamesOfList(List<EntityClassA> list) {
      namesArray = new String[list.size()];
      for (int j = 0; j < list.size(); j++) {
          namesArray[j] = list.get(j).getName();
      }
      return Array;
}

由于我不想为每个类重写此方法,我想使用泛型来概括这一点。但我不知道究竟是怎么回事。我之前没有使用过泛型,我见过的所有例子都不适用于此。

3 个答案:

答案 0 :(得分:4)

如果类有一个共同的超类或接口,你可以这样做:

private String[] getNamesOfList(List<? extends SuperInterface> list) {
      namesArray = new String[list.size()];
      for (int j = 0; j < list.size(); j++) {
          namesArray[j] = list.get(j).getName();
      }
      return namesArray;
}

如果他们不这样做,你可以引入一个并使所有暴露getName()方法的类实现这个接口:

interface SuperInterface {
    String getName();
}

答案 1 :(得分:1)

使用Java SE 8(除非您与Oracle签订了支持合同以获取旧Java版本的安全更新,否则建议使用Oracle JRE),您可以使用:

private <T, R> List<R> map(List<T> list, Function<? super T, ? extends R> mapper) {
    return list.stream().map(mapper).collect(Collectors.toList());
}

然后:

List<EntityClassA> list = ...;
List<String> names = map(list, EntityClassA::getName);

使用此代码,您可以从任何列表类型中提取任何属性列表。

正如其他提到的,如果你有一个共同的界面,如

interface SuperInterface {
    String getName();
}

并且只想获取名称(没有其他属性),然后您可以使用:

private List<String> getNames(List<? extends SuperInterface> list) {
    return list.stream().map(SuperInterface::getName).collect(Collectors.toList());
}

然后:

List<EntityClassA> list = ...;
List<String> names = getNames(list);

答案 2 :(得分:0)

实际上,如果你的所有实体都有相同的字段,最好重构一下

您可以拥有一个所有其他实体类都扩展的超类:

public abstract class BaseEntity {
    private int id;
    private int name; 

    // creation date, modification date, if you need them

    //getters, setters
}

然后你的实体会扩展它。然后你可以替换

private String[] getNamesOfList(List<EntityClassA> list) {

private String[] getNamesOfList(List<? extends BaseEntity> list) {