我有ArrayList<Unit> units
。我想编写一个函数,它将返回指定子类的所有对象,用作参数。但是,我无法让它发挥作用。这就是我所拥有的:
public static ArrayList<? extends Unit> getTheseUnits(Class<? extends Unit> specific_unit) {
ArrayList<specific_unit> res = new ArrayList<>(); //'specific_unit' is in red here. Adding '.class' or '.getClass()' after it does not resolve anything
for (Unit u : units){
if (u instanceof specific_unit){
res.add(u);
}
}
return res;
}
答案 0 :(得分:4)
您无法在变量上使用instanceof
。相反,您应该使用isInstance
。
只需更换此行:
if (u instanceof specific_unit) {
与
if (specific_unit.isInstance(u)){
答案 1 :(得分:4)
按类过滤:
QQQ
如果要将此方法设置为参数化,请使用其他选项:
public static List<Unit> getUnitsByClass(Class<? extends Unit> specificClass, List<? extends Unit> units) {
return units.stream()
.filter(e -> e.getClass().equals(specificClass))
.collect(Collectors.toList());
}
但在第二种方法中,您将获得未经检查的投射警告。
答案 2 :(得分:2)
如果您更改方法签名,它可以起作用:
public static <T extends Unit> ArrayList<T> getTheseUnits(Class<T> specific_unit) {
ArrayList<T> res = new ArrayList<>();
for (Unit u : units){
if (specific_unit.isAssignableFrom(u.getClass()) {
res.add(u);
}
}
return res;
}
只需使用特定类型的通用(<T>
)而不是通配符(?
)。这是创建返回类型(ArrayList<T>
)所必需的。
此外,您应该使用isAssignableFrom()
代替instanceof
。请注意,isAssignableFrom()
还会检查子类型。
请再次检查此代码,因为我没有测试过。
答案 3 :(得分:1)
试试这个:
public static <T extends Unit> ArrayList<T> getTheseUnits(Class<T> specific_unit) {
ArrayList<T> res = new ArrayList<T>();
for (Unit u : units){
if (specific_unit.isInstance(u)){
res.add((T) u);
}
}
return res;
}
答案 4 :(得分:0)
也许你可以尝试不使用类而是在声明和返回中使用接口(所以List而不是ArrayList和Unit而不是SpecificUnit)。我已经重命名了类和实例java样式......例如:
public static List<? extends Unit> getTheseUnits(Class<? extends Unit> specificUnit, List<Unit> units) {
List<Unit> res = new ArrayList<Unit>();
for (Unit u : units){
if (specificUnit.isInstance(u)){
res.add(u);
}
}
return res;
}
编译。可能它正是你要找的......让我知道它是否有用