Java 如何调用重载方法的最特定版本?

Java 如何调用重载方法的最特定版本?,java,dispatch,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(Collisi

我有一个基本的碰撞系统,它检查每一对物体,看它们是否在碰撞

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);
        }
    }
}
其中
Player
SolidRectangle
Snowflake
都扩展
Drawable
。我希望上面的循环调用每个可用方法的最具体版本,但目前它只调用超类
Drawable
的版本。有没有办法不用通过
instanceof
手动检查类是什么

我可以从下面的例子中看出这是怎么不可能的:如果
B扩展A
C扩展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
的调用是不明确的,但我希望有人能比我更深入地了解这件事。有什么办法可以解决这个问题吗?

提供了一种替代Java的方法

除此之外,还有一些选择:

有一种过时的方法在Java中实现了多分派支持,还有一些其他项目使用反射来支持Java中的多方法:Java。也许还有更多

<>你也可以考虑一个支持java的语言,它支持多方法,比如(或者这些链接指向例子)。

提供了java中的一种替代。 除此之外,还有一些选择:

有一种过时的方法在Java中实现了多分派支持,还有一些其他项目使用反射来支持Java中的多方法:Java。也许还有更多


您还可以考虑一种支持java的语言,它支持多方法,比如(或这些链接指向示例)。

您还需要确保<代码> CollisionHandler。HooCyLoLIION(A,B)< /C> >等效于<代码> CollisionHandler。一半的问题通过正常方法解决:

drawable.handleCollision(drawable2)
但要做到这一点,就有点像试图实现
equals()
在不同类型的对象之间工作所需的检查(有点繁琐)


从概念上讲,您似乎在寻找一种基于(无序)运行时类型对选择要调用的函数的方法。类似于
HashMap
,除了上次我检查的Java不支持泛型泛型(而且集合可能没有那么有效)。这方面最有效的解决方案是通过反射(确保同时获得类对(Player.class,Snowflake.class)和类对(Snowflake.class,Player.class),来填充
HashMap
,但即使这样,它似乎也不是很有效。

您还需要确保
CollisionHandler.handleCollision(a,b)
相当于
碰撞处理程序。handleCollision(b,a)
。一半的问题通过正常方法调度得到解决:

drawable.handleCollision(drawable2)
但要做到这一点,就有点像试图实现
equals()
在不同类型的对象之间工作所需的检查(有点繁琐)

从概念上讲,您似乎在寻找一种基于(无序的)一对运行时类型选择要调用的函数的方法。类似于
HashMap
,除了上次我检查的以外,Java不支持泛型泛型(而且集合可能没有那么有效)。沿着这些思路,最有效的解决方案是通过反射(确保同时获得类对(Player.class,Snowflake.class)和类对(Snowflake.class,Player.class))来填充
哈希映射,但即使这样,它似乎也不是很有效