Java 是否可以在同一方法中将一个对象强制转换为两个不同的对象?
抱歉,如果这是措词不当或可搜索,我找不到它的任何东西,我几乎完全自学成才 我有一个Java 是否可以在同一方法中将一个对象强制转换为两个不同的对象?,java,Java,抱歉,如果这是措词不当或可搜索,我找不到它的任何东西,我几乎完全自学成才 我有一个实体类和多个子类,建筑和生物是这里的相关类 我有一个setTarget(实体e)方法,我想用于建筑和生物类,因为在这个级别上它们是相同的 我想知道是否有可能将e投射到建筑或生物,这取决于它是哪种类型,而不是使用相同的代码创建两个完整的方法 private void setTarget(Entity e) { if (e.getType.equals("Creature")) { Creatu
实体
类和多个子类,建筑
和生物
是这里的相关类
我有一个setTarget(实体e)
方法,我想用于建筑
和生物
类,因为在这个级别上它们是相同的
我想知道是否有可能将e投射到建筑
或生物
,这取决于它是哪种类型,而不是使用相同的代码创建两个完整的方法
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
}
}
我意识到我可以通过将目标机制放在实体
类中来实现这一点,但这样一来,该代码将与所有其他没有/需要目标的子类无关
任何帮助或提示将非常感谢,提前感谢
编辑:
我查看了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实例的Building
将返回true,而mySmallBuilding.getClass().equals
(Building.class)
将返回false,因为调用getClass()小型建筑
上的
将返回与建筑
的类不同的类
对象。话虽如此,通常建议在依赖子类的程序中使用instanceof
,例如在编写equals()
方法时使用getClass()
(因为两个对象必须属于同一类)。下面是一个如何工作的示例:
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)
}
在两个if
语句中都必须有setTarget()
。另一个选项是为setTarget()
定义一个接口,如下所示:
public interface Targetable {
public void setTarget();
}
然后让建筑
和生物
实现目标
。然后可以将setTarget()
定义为:
private void setTarget(Targetable t) {
t.setTarget();
}
或:
为什么需要区分
生物
和建筑
我可能会创建一个接口Targetable
(或更好的名称),该接口包含方法setTarget()
,并由生物
和建筑
实现
这样,在您的方法setTarget(实体e)
中,您不需要查询生物
和建筑
(将来可能还会有更多的类),但您只需检查Targetable的e实例,将其转换为此接口类型并在其上运行setTarget()
注意:需要使用实例和强制转换通常表明您的代码没有以最佳方式构造…看起来您需要工厂模式。如果您使用多态性,这很容易实现。为什么要将所有代码放在一行上?阅读是不可能的。你可以在if
语句中使用e.getClass().equals(bioture.class)
或e instanceof bioture
。if(o instanceof Building){Building b=(Building)o;}else if(o instanceof bioture){bioture c=(bioture)o;}
你为什么不简单地定义两个setTarget()方法,一个取一个生物,一个拿着一栋楼?这会简单得多,而且你的类的用户不会错误地假设目标可以是任何实体。好的,实例,绝对是一种比我目前使用的更好的方法,谢谢。@Flash做了一次编辑,我认为这将极大地帮助您解决问题。我以前从未使用过界面,但它看起来像是我想要做的,我将研究它们是如何工作的!非常感谢!对不起,我不知道这件事yet@Majora320:哈哈,看来Targetable
是个好主意,如果我们俩都是独立来的;-)我仍然会保留我的答案,也许这有助于人们更好地理解,因为措辞不同。即使没有帮助,也没有坏处:-PBoth you和@Majora320认为实现一个接口是可行的,所以我正在研究这个问题。我一直在关注youtube教程,不幸的是,这些教程似乎从未完成,我试图在没有它们的情况下继续学习。所以是的,我的代码结构可能不是太优化,但我不知道我能做些什么。@Flash:你可以将你的代码发布到,并获得关于如何使代码更干净的有用反馈。是在开发早期还是在我有一个更完善的程序时这样做更好?@Flash:我认为在开发早期这样做更好,因为这样,调整应用程序的全局结构/体系结构就更容易了。不过,您发布的代码应该是有效的。有关更多信息,请参阅。
private void setTarget(Entity e) {
if (t instanceof Targetable) {
((Targetable)t).setTarget();
}
}