java - 在java中的重载方法中使用更具体的数据类型

标签 java oop

我有一些带有相同接口(interface)类型的不同对象的数组列表,例如:

Interface interface {}

class A implements interface {}

class B implements interface {}

我还有一个重载方法,用于实现接口(interface)的所有继承对象:

public void doSomething(A obj) {}

public void doSomething(B obj) {}

编译器还强制我使用接口(interface)编写重载方法:

public void doSomething(interface obj) {}

然后我遍历列表的值并调用方法:

for (interface obj: myList) {
   doSomething(obj);
}

现在,由于 obj 的类型是“interface”,因此如果 obj 实际上是 B 类型,则调用 doSomething(interface obj) 而不是 doSomething(B obj)。

我可以让java做其他事情吗,这样当obj的类型为A时它调用doSomething(A obj),当obj的类型为B时它调用doSomething(B obj)?

最佳答案

Java 使用早期绑定(bind),这意味着 obj 的类型是在编译期间定义的,而不是在运行时定义的。由于您的代码表明 obj 是接口(interface)类型,因此编译器将始终调用以接口(interface)作为参数的方法。

您有两种选择让它调用正确的方法:

  1. (非常难看)在调用对象时使用instanceof和cast检查obj类型。

    for (interface obj: myList) {
       if(obj instanceof A)
          doSomething((A) obj);
       else if(obj instanceof B)
          doSomething((B) obj);
       else
          doSomething(obj); // Calls the method receiving Interface
    }
    
  2. 在接口(interface)中实现一个访问者方法,这样A和B在访问时都会调用方法doSomething(this)。

    interface Interface {
        void visit(OtherClass methodHolder);
    }
    
    class A implements Interface {
        public void visit(OtherClass methodHolder) {
            methodHolder.doSomething(this);
        }
    }
    
    class B implements Interface {
        public void visit(OtherClass methodHolder) {
            methodHolder.doSomething(this);
        }
    }
    

关于java - 在java中的重载方法中使用更具体的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1835310/

相关文章:

java - 无法解析符号网络 android studio

java - 复制构造函数的一个问题

javascript - image.onload 到方法中

python - 如何从继承字符串类型的新类访问字符串值

java - 运行 JAR 时图像不显示

java - 在 JSP/Spring 中禁用内容安全策略

java - 如何保护我的 Android 应用程序和与 MySql 服务器通信的 PHP 文件之间的连接?

java - Java方法签名后奇怪的 "[]"

matlab - 如何在面向对象的 Matlab 中定义派生属性

oop - 域类中应该采用什么逻辑,Grails 中的服务应该采用什么逻辑?