使用泛型类型参数的 Java 重载

标签 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(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/

相关文章:

java - 无法访问特定 weblogic 上的 web 应用程序的服务

java - 使用 CATALINA_OPTS 添加到 Tomcat 类路径

swift 2.0 : Parametrized classes don't call proper == function if it inherits from class that is Equatable

java - 为什么要在 Java Stream 接口(interface)中重载 varargs 方法 of()?

java - 如何处理2个几乎相同的构造函数

java - Spring RestTemplate jackson 获取特定字段

java - 是否可以在 Eclipse 中使成员变量自动私有(private)化?

java - 泛型和转换为正确的类型

Scala 协方差和下限类型说明

vb.net - 限制列表(Of T)的大小 - VB.NET