抱歉,如果措辞不佳或可搜索,我找不到任何东西,而且我几乎完全是自学成才。
我有一个Entity
类和多个子类,其中的Building
和Creature
是相关的。
我有一个setTarget(Entity e)
方法,我想同时用于Building
和Creature
类,因为在此级别上它们是相同的。
我想知道是否有可能根据类型将e强制转换为Building
或Creature
,而不是使用相同的代码创建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关键字instanceof
或getClass()
。两者之间的区别在于,例如,如果类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();
}
然后具有
Building
和Creature
隐含的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/