Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在同一方法中将一个对象强制转换为两个不同的对象?_Java - Fatal编程技术网

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();
    }
}