java - 如何调用重载方法的最具体版本?

标签 java dispatch

我有一个原始的碰撞系统,它检查每对对象以查看它们是否发生碰撞。

int size = drawables.size();
for(int i = 0; i < size; ++i)
{
    for(int j = i+1; j < size; ++j)
    {
        Drawable drawable = drawables.get(i);
        Drawable drawable2 = drawables.get(j);
        if(CollisionDetector.areColliding(drawable, drawable2))
        {
            CollisionHandler.handleCollision(drawable, drawable2);
        }
    }
}

CollisionDetectorCollisionHandler 都有各自功能的通用和特定版本,例如

public static boolean handleCollision(Drawable drawable1, Drawable drawable2)
public static boolean handleCollision(Player player, SolidRectangle rectangle)
public static boolean handleCollision(Player player, Snowflake snowflake)

其中 PlayerSolidRectangleSnowflake 都扩展了 Drawable。我希望上面的循环调用每个可用方法的最具体版本,但目前它只会调用父类(super class) Drawable 的版本。有没有什么方法可以做到这一点,而无需通过 instanceof 手动检查类是什么?

从以下示例中我可以看出这是不可能的:如果 B 扩展 AC 扩展 A 并且我编写方法

public void foo(A a, C c)
public void foo(B b, A a)

然后就有了

A objectB = new B();
A objectC = new C();
foo(objectB, objectC);

foo 的调用会产生歧义,但我希望有人比我对此事有更深入的了解。有什么办法可以解决这个问题吗?

最佳答案

Visitor Design Pattern提供 multiple dispatch 的替代方案在Java中。

除此之外,还有一些替代方案:

有一个过时的 MultiJava Project在 Java 中实现了多分派(dispatch)支持,还有一些其他项目使用反射来支持 Java 中的多方法:Java Multimethods , Java Multimethods Framework 。也许还有更多。

您还可以考虑使用另一种基于 Java 的语言,它支持多种方法,例如 ClojureGroovy (这些链接指向示例)。

关于java - 如何调用重载方法的最具体版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589098/

相关文章:

java - 使用 swagger 创建 api 文档

assembly - 如何编写在现代 x64 处理器上高效运行的自修改代码?

带有模板参数的 C++ 函数分派(dispatch)

java - Selenium 错误: org. openqa.selenium.NoSuchElementException:无法找到元素:{"method":"name","selector":"db_vaults__button"}

java - 如何将节点 id 替换为其各自的属性?

java - Android MVP 依赖规则

java - 线程和Runnable对象的区别

raku - 为什么 perl6 multi 默认为 sub?

Swift 协议(protocol)扩展静态方法与父类(super class)和子类的调度

Laravel 5.5 队列调度不起作用