我已经尝试用泛型做一些事情,但我个人似乎找不到任何简单的解决方案。尽管如此,我仍然认为将这 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/