带有泛型类型参数的Java重载
我在一个类中有以下方法:带有泛型类型参数的Java重载,java,generics,overloading,Java,Generics,Overloading,我在一个类中有以下方法: 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(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(a类){
//....
}
作废删除(b类){
//...
}
作废删除(列表){
对于(类别a:列表){
删除(a);
}
}
作废删除(列表){
对于(b类:列表){
删除(b);
}
}
重载对于前两种方法很有效。但第三种和第四种方法之间存在冲突
有没有可能用一种方法来代替它们?我尝试了以下方法,但不正确:
void delete(List<? extends Object> list){
for (Object o: list){
delete((o.getClass())o);
}
}
voiddelete(List重载是在编译时解决的,因此您不能依赖于运行时类型
您可以使用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);
}
}
}
void delete(List您尝试使用不同的实现来删除List
和List
。您可以在Java中这样做,但不能使用相同的方法名称
因此,您可以有一个deleteList(列表列表列表)
和一个deleteBList(列表列表列表)
从技术上讲,重载意味着不同的方法共享相同的基名称,但具有不同的参数类型,因此编译器知道调用哪个方法
换句话说,有效的方法名是由您创建的名称加上参数类型组成的。这个概念是在引入泛型之前定义的,所以它只看到delete(List)
,忽略添加到列表中的泛型类型参数。因此有两个方法具有相同的有效方法名称,这就是编译器所抱怨的
因此,通过使方法基名称不同来帮助编译器,一切都正常。使用instanceof
检查对象难道不能只说“将o转换为它的实例所在的任何类”?没有显式地将其强制转换到该类?@ArianHosseinzadeh No,编译器必须知道传递给delete
的参数的编译时类型,以便确定应该调用哪个重载方法。