java - 多态性和基于实例的switch case

标签 java polymorphism visitor-pattern

我有一个名为“I”的接口(interface):

package org.example;

public interface I {
}

非常简单:-)

我有实现这个接口(interface)的类。它们被称为 A、B、C、D、E 等。

A类和B类有具体的方法,如下所示。其他类则没有。

public class A implements I {
    public void sayHelloFromA() {
        System.out.println("Hello from A");
    }
}

public class B implements I {
    public void sayHelloFromB() {
        System.out.println("Hello from B");
    }
}

我的主要方法迭代 I 对象列表,我想根据类的类型执行特定操作。

package org.example;

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(final String[] args) {
        final A a = new A();
        final B b = new B();
        final C c = new C();

        final List<I> list = new ArrayList<I>();
        list.add(a);
        list.add(b);
        list.add(c);

        for (final I i : list) {
            sayHello(i);
        }
    }

    public static void sayHello(final A a) {
        a.sayHelloFromA();
    }

    public static void sayHello(final B b) {
        b.sayHelloFromB();
    }

    public static void sayHello(final I i) {
        System.out.println("Unsupported");
    }

}

问题就在这里;输出是:

Unsupported
Unsupported
Unsupported

我知道它行不通,但问题是,如何在不使用instanceof或反射的情况下使其工作。诀窍是我无法修改接口(interface) I(在现实生活中,我认为它是一个 javax.swing.tree.TreeNode)。

我不使用访问者模式,因为我相信当您拥有一组固定的类类型并且在这些类型上添加新操作时,访问者模式更适合。在我的现实生活中,情况恰恰相反:我只有一个操作,并且经常向列表中添加新类型...

最佳答案

由于 Java 是静态类型语言,因此在编译时决定调用哪个方法重载,这意味着您不能根据实例的实际类型来调用重载方法,只能根据其>声明的类型。

如果您不想使用反射来查找您的实例是哪个类,但您可以更改 A 和 B,则可以添加另一个接口(interface)供它们实现:

public interface I2 {
  void sayHello();
}

并让 AB 实现它:

public class A implements I, I2 {
    public void sayHelloFromA() {
        System.out.println("Hello from A");
    }

   public void sayHello() {
       sayHelloFromA();
   }
}

public class B implements I, I2 {
    public void sayHelloFromB() {
        System.out.println("Hello from B");
    }

    public void sayHello() {
       sayHelloFromB();
   }
}

关于java - 多态性和基于实例的switch case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27403011/

相关文章:

java - 为什么动态调度的目标不是在编译时确定的?

java - 多态性,如何避免类型转换?

python - View 中的 Django 多态性

java - 一些具有访问者模式的非常通用的代码

c++ - 关于碰撞检测系统中类结构的建议

java - 警告 : A HTTP GET method, public javax.ws.rs.core.Response... 抛出 org.codehaus.jettison.json.JSONException,不应消耗任何实体

java - 使用 Collections.sort() 对 ArrayList 进行复杂排序?

Java/Scala Kafka Producer 不向主题发送消息

c++ - 寻求更好地理解 std::visit

java - 服务无法正常启动