gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:02:49 25 4
gpt4 key购买 nike

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

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/

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