我有如下两种方法
private List<Long> getIds(String name, List<Cat> cats) {
List<Long> catIds = new ArrayList<>();
for (Cat cat : cats) {
if (cat.getName().equals(name)) catIds.add(cat.getId());
}
return catIds;
}
private List<Long> getIds(String name, List<Dog> dogs) {
List<Long> dogIds = new ArrayList<>();
for (Dog dog : dogs) {
if (dog.getName().equals(name)) dogIds.add(dog.getId());
}
return dogIds;
}
我的猫狗类如下
public class Cat {
String name;
Long id;
// additional variables
// getters and setters
}
public class Dog {
String name;
Long id;
// additional variables
// getters and setters
}
为了避免冗余,我想将上述两个方法转换为一个泛型方法。
我尝试了以下方法
private List<Long> getIds(String name, List<T> objects) {
List<Long> ids = new ArrayList<>();
for (T object : objects) {
if (object.getName().equals(name)) ids.add(object.getId());
}
return ids;
}
但它没有成功,因为它提示通用 T 没有 getName
或 getId
这里的 Cat
和 Dog
是内置的 java 类。因此,我不能执行继承并为它们提供父类(super class)Animal
,其中name
和id
作为数据变量.
有什么方法可以在不实现继承的情况下完成上述两种方法的合并?
最佳答案
另一种可能性:如果您使用的是 Java 8,则可以将名称和 ID 的 getter 方法作为附加参数传入该方法。这是类型安全的,既不需要反射也不需要修改原始类。
private <T> List<Long> getIds(String name, List<T> objects, Function<T, String> getName, Function<T, Long> getId) {
List<Long> ids = new ArrayList<>();
for (T object : objects) {
if (getName.apply(object).equals(name)) {
ids.add(getId.apply(object));
}
}
return ids;
}
或更短,使用流:
private <T> List<Long> getIds(String name, List<T> objects, Function<T, String> getName, Function<T, Long> getId) {
return objects.stream().filter(o -> getName.apply(o).equals(name))
.map(getId).collect(Collectors.toList());
}
用法:
List<Long> ids = getIds("some name", listOfCats, Cat::getName, Cat::getId);
当然,虽然这种方法的主体在所有情况下都是相同的,但您必须以不同的方式调用它,具体取决于输入。为此,您可以提供一个入口方法,以适当的方式调用其他方法或在类型错误的情况下引发异常。
private List<Long> getIds(String name, List<?> objects) {
if (objects.size() == 0) {
return Collections.emptyList();
}
if (objects.get(0) instanceof Cat) {
return getIds(name, (List<Cat>) objects, Cat::getName, Cat::getId);
}
if (objects.get(0) instanceof Dog) {
...
}
throw new IllegalArgumentException("List containing unsupported type!");
}
关于java - 接受一个类对象或另一个类对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36031635/