Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有泛型类型参数的Java重载_Java_Generics_Overloading - Fatal编程技术网

带有泛型类型参数的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
的参数的编译时类型,以便确定应该调用哪个重载方法。