抱歉,如果措辞不佳或可搜索,我找不到任何东西,而且我几乎完全是自学成才。

我有一个Entity类和多个子类,其中的BuildingCreature是相关的。

我有一个setTarget(Entity e)方法,我想同时用于BuildingCreature类,因为在此级别上它们是相同的。

我想知道是否有可能根据类型将e强制转换为BuildingCreature,而不是使用相同的代码创建2个完整方法。

private void setTarget(Entity e) {
    if (e.getType.equals("Creature")) {
        Creature c = (Creature)e; //rest of code assumes c is now a creature rather than a building
    }
}


我意识到我可以通过将目标机制放入Entity类中来做到这一点,但随后的代码将与所有其他没有/需要目标的子类无关。

任何帮助或提示将不胜感激,在此先感谢。

编辑:
我研究了instanceof,它肯定会清理一些代码,但是没人理解我的意思。

private void setTarget(Entity e) {
    if (e instanceof Creature) {
        Creature c = (Creature)e;
    } else if (e instanceof Building) {
        Building c = (Building)e;
    }
    //Building OR Creature code here ie;
    c.setTarget();
}


这可以实现吗?

最佳答案

您可以使用Java关键字instanceofgetClass()。两者之间的区别在于,例如,如果类SmallBuilding子类化Building,则mySmallBuilding instanceof Building将返回true,而mySmallBuilding.getClass().equals (Building.class)将返回false,因为在getClass()上调用SmallBuilding将返回与Class类不同的Building对象。话虽如此,通常建议在与子类相关的程序(例如您的程序)中使用instanceof,并在例如编写getClass()方法时使用equals()(因为两个对象必须属于同一类)。这是一个如何工作的示例:

private void setTarget(Entity e) {
    if (e instanceof Creature) {
        Creature c = (Creature)e;
        // Creature-specific code here
    } else if (e instanceof Building) {
        Building b = (Building)e;
        // Building-specific code here
    }
    // Could add an else for other Entity subclasses (might throw UnsupportedOperationException)
}


编辑:根据您对问题所做的编辑,您可以执行以下操作:

private void setTarget(Entity e) {
    if (e instanceof Creature) {
        Creature c = (Creature)e;
        c.setTarget();
    } else if (e instanceof Building) {
        Building b = (Building)e;
        b.setTarget();
    }
    // Could add an else for other Entity subclasses (might throw UnsupportedOperationException)
}


您必须在两个setTarget()语句中都具有if。另一个选择是为setTarget()定义一个接口,如下所示:

public interface Targetable {
    public void setTarget();
}


然后具有BuildingCreature隐含的Targetable。然后可以将setTarget()定义为:

private void setTarget(Targetable t) {
    t.setTarget();
}


要么:

private void setTarget(Entity e) {
    if (t instanceof Targetable) {
        ((Targetable)t).setTarget();
    }
}

关于java - 是否可以在同一方法中将对象转换为2个不同的事物?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36378337/

10-11 20:27