java - 使用泛型从三个相似的方法中创建一个简洁的方法

标签 java generics

我已经尝试用泛型做一些事情,但我个人似乎找不到任何简单的解决方案。尽管如此,我仍然认为将这 3 种类似的方法留在原样是一种罪过。

    public List<PassengerPlane> getPassengerPlanes() {
        List<PassengerPlane> passengerPlanes = new ArrayList<>();
        for (Plane plane : planes) {
            if (plane instanceof PassengerPlane) {
                passengerPlanes.add((PassengerPlane) plane);
            }
        }
        return passengerPlanes;
    }

    public List<MilitaryPlane> getMilitaryPlanes() {
        List<MilitaryPlane> militaryPlanes = new ArrayList<>();
        for (Plane plane : planes) {
            if (plane instanceof MilitaryPlane) {
                militaryPlanes.add((MilitaryPlane) plane);
            }
        }
        return militaryPlanes;
    }

    public List<ExperimentalPlane> getExperimentalPlanes() {
        List<ExperimentalPlane> experimentalPlanes = new ArrayList<>();
        for (Plane plane : planes) {
            if (plane instanceof ExperimentalPlane) {
                experimentalPlanes.add((ExperimentalPlane) plane);
            }
        }
        return experimentalPlanes;
    }

最佳答案

您需要的是通用方法,但问题是 instanceof无法检查类型参数(它实际上在编译期间被删除),它需要实际的类引用。因此,您可以明确地将其提供给该方法:

public <T extends Plane> List<T> getPlanes(Class<T> claz) {
  List<T> result = new ArrayList<>();
  for (Plane plane : planes) {
    if (claz.isInstance(plane)) {
      result.add(claz.cast(plane));
    }
  }
  return result;
}
注意 instanceof并且显式转换更改为对 .isInstance() 的调用和 .cast()像这样使用它
getPlanes(PassengerPlane.class)

关于java - 使用泛型从三个相似的方法中创建一个简洁的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63141071/

相关文章:

java - 检查参数化类型是否是特定类型实例

Java 通用接口(interface) List<T> 不接受对象类型

java - "d"符号在适用于某些对象的方法列表中代表什么?

java - android expandablelistView setAdapter不明确

java - 自制类的递归indexOf()方法

java - Java 泛型是一个全有或全无的决定吗?

java - 在 java 中使用未指定的通用通配符

java - 调用@Bean 方法会创建对象的新实例还是 bean 实例?

java - 将 JTree (CheckboxTree) 添加到 JDialog

c# - 在 Ninject 中寻找通用接口(interface)的具体实现