gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:38:28 24 4
gpt4 key购买 nike

我有一些具有相同接口(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com