我有一个原始的碰撞系统,它检查每对对象以查看它们是否发生碰撞。
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);
}
}
}
CollisionDetector
和 CollisionHandler
都有各自功能的通用和特定版本,例如
public static boolean handleCollision(Drawable drawable1, Drawable drawable2)
public static boolean handleCollision(Player player, SolidRectangle rectangle)
public static boolean handleCollision(Player player, Snowflake snowflake)
其中 Player
、SolidRectangle
和 Snowflake
都扩展了 Drawable
。我希望上面的循环调用每个可用方法的最具体版本,但目前它只会调用父类(super class) 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
的调用会产生歧义,但我希望有人比我对此事有更深入的了解。有什么办法可以解决这个问题吗?
最佳答案
Visitor Design Pattern提供 multiple dispatch 的替代方案在Java中。
除此之外,还有一些替代方案:
有一个过时的 MultiJava Project在 Java 中实现了多分派(dispatch)支持,还有一些其他项目使用反射来支持 Java 中的多方法:Java Multimethods , Java Multimethods Framework 。也许还有更多。
您还可以考虑使用另一种基于 Java 的语言,它支持多种方法,例如 Clojure或Groovy (这些链接指向示例)。
关于java - 如何调用重载方法的最具体版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589098/