Java泛型与泛型类型参数
作者:互联网
我在一课中有以下方法:
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);
}
}
}
标签:generics,overloading,java 来源: https://codeday.me/bug/20191025/1931128.html