java - 接受一个类对象或另一个类对象的方法

标签 java

我有如下两种方法

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 没有 getNamegetId

这里的 CatDog 是内置的 java 类。因此,我不能执行继承并为它们提供父类(super class)Animal,其中nameid 作为数据变量.

有什么方法可以在不实现继承的情况下完成上述两种方法的合并?

最佳答案

另一种可能性:如果您使用的是 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/

相关文章:

Java 日期格式化程序

java - Maven 2.2.1 附加测试。问题-Dmaven.test.skip=true

java - 如何在 Ubuntu 下为 Java 设置 SQLite?

java - 如何从 Java Card 2.2.2 SIM 卡小程序启动具有特定 URL 的浏览器?

用于在 Python 中引发错误的 Java 模拟

java - 可能会减慢Java虚拟机的时间吗?

java - Spring boot能否根据property文件的内容动态创建端点?

java - PSQLException : ERROR: relation "TABLE_NAME" does not exist

c# - 来自 Model 的完整 Java/C# 代码生成工具?

java - 如何修复 Fortify 竞争条件 : Singleton Member Field issue