如何对正确的子类类型执行泛型转换?

时间:2017-11-16 03:39:12

标签: java

目前,我已经为我创建的方法提供了以下代码:

public boolean overlaps(CollisionBody2D collider)
{
    //other method code
    if (collider instanceof ArcBody2D)
        return this.overlaps((ArcBody2D) collider);
    else if (collider instanceof CircleBody2D)
        return this.overlaps((CircleBody2D) collider);
    else if (collider instanceof PointBody2D)
        return this.overlaps((PointBody2D) collider);
    else if (collider instanceof LineBody2D)
        return this.overlaps((LineBody2D) collider);
    else if (collider instanceof BoxBody2D)
        return this.overlaps((BoxBody2D) collider);
    return false;
}

每个ArcBody2D等都是CollisionBody2D的子类,并为每个其他类型(ArcBody2D等)定义了碰撞的方法。我想用一般的转换来替换eyeore if if语句(如果是instanceof)...到正确的子类类型,这样我就不必继续增加if语句,因为我添加了更多的碰撞器类型。

理想情况下,我正在努力实现以下目标:

return this.overlaps((collider.subclassType()) collider);

我尝试过使用泛型,但问题是它要求你预定义类类型,这对我来说并不是很有用,因为我需要一个处理碰撞的方法,而不需要预定义CollisionBody2D的类型。调用。例如:

BoxBody2D box = new BoxBody2D(parameters);
CollisionBody2D colliders [];
//populate array
for (CollisionBody2D c: colliders)
{
    if (box.overlaps(c))
        //do something
}

我尝试过使用泛型,但问题是它们仍然需要您在调用方法时定义类型。除了这个长篇大论之外,还有其他方法可以达到这个目的吗?

3 个答案:

答案 0 :(得分:0)

我相信你可以做一些事情 (省略例外处理)

public boolean overlaps(CollisionBody2D collider)
{
    Class c = collider.getClass();

    return this.overlaps( c.cast( collider) );
}

答案 1 :(得分:0)

我认为这听起来像是设计问题。

为什么不使用界面而不是

public boolean overlaps(Collidable collider) {
    return collider.overlaps(this);
}

您需要一个看起来像这样的新界面:

public interface Collidable {
    boolean overlaps(Collidable collider);
}

你可以使用“同类对撞机”或任何你需要的东西:

public class SameClassCollider implements Collidable {
    @Override
    public boolean overlaps(Collidable collider) {
        return (collider instanceof this.getClass());
    }
}

我主要建议使用Strategy pattern。您可能还想查看Decorator pattern,以防您可能想要建立更加柔和的碰撞。

答案 2 :(得分:0)

以下是您必须遵循的步骤(机制)。我已经使用泛型方法来实现这一点。步骤如下。

  1. 确保您的“重叠”方法也在超类(CollisionBody2D)中定义,并在您的子类中相应地重写(ArcBody2D等)如果您需要在稍后阶段使用运行时多态性< / em>的
  2. 将“重叠”方法设为如下通用方法:

    public boolean overlapps(T t){     //你的代码 }

  3. 最后,在方法中,您可以将其称为:

    new CollisionBody2D.overlaps(new ArcBody2D());

  4. 所以,你不需要施放或任何东西,它将调用CollisionBody2D类中的重叠方法。但是,如果你需要运行你传递的对象的重叠方法,我建议你使用运行时的polimorphism并继续相应,但至于你上面的问题我不认为你有这样的要求,而不是调用重叠你引用的类的方法。