我有以下问题,希望有人能解决这个问题。设置是我具有来自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;
}
由于我不想为每个类重写此方法,我想使用泛型来概括这一点。但我不知道究竟是怎么回事。我之前没有使用过泛型,我见过的所有例子都不适用于此。
答案 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) {