我在一个类中有以下方法:
void delete(ClassA a) {
//....
}
void delete(ClassB b) {
//...
}
void delete(List<ClassA> list) {
for (ClassA a: list) {
delete(a);
}
}
void delete(List<ClassB> list) {
for (ClassB b: list){
delete(b);
}
}
对于前两种方法,重载工作正常。但是第三种和第四种方法之间存在冲突。
是否可以用一种方法代替它们?我试过下面的方法,不对:
void delete(List<? extends Object> list){
for (Object o: list){
delete((o.getClass())o);
}
}
如何在运行时检测列表中实例的类类型并调用适当的方法?
最佳答案
重载在编译时解决,因此您不能依赖运行时类型。
您可以做的是使用 instanceof
检查运行时类型并显式转换为相关类型:
void delete(List<? extends Object> list){
for (Object o: list) {
if (o instanceof ClassA) {
delete((ClassA) o);
} else if (o instanceof ClassB) {
delete((ClassB) o);
}
}
}
关于使用泛型类型参数的 Java 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45729119/