Java从Object转换为子类

时间:2016-05-26 17:23:03

标签: java class oop inheritance types

这是我的Scene.java代码。它有不同类型的对象,所有这些对象都包含在一个名为targets的公共ArrayList中。所有这些都共享一个返回其标识符的toString()方法。我想使用targets列表来确定场景中是否有与给定标识符匹配的对象,无论其类型如何:

ArrayList<NPC> npcs = new ArrayList<NPC>();
ArrayList<Item> items = new ArrayList<Item>();
ArrayList<EnviromentalObject> enviromental_objects = new ArrayList<EnviromentalObject>();

ArrayList<Object> targets;

public Object check_for_target(String target_name){
    targets.addAll(npcs);
    targets.addAll(items);
    targets.addAll(enviromental_objects);
    for (Object target : targets){
        if (target.toString() == target_name){
            return target;
        }
    }
    return null;

以下是Game.java中的代码,它检查给定的标识符。如果当前场景存在匹配,我想知道对象的类型并将其视为真实类型。现在,我有以下代码,我知道它不会起作用,但也许它有助于我的想法。

Object target = current_scene.check_for_target(target_name);
        if (target == null){
            System.out.println(UNRECOGNIZED_TARGET_MESSAGE);
        } else {
            String target_type = target.getClass().getName();
            target = (target_type) target;
        }

获取对象类型然后能够使用该对象的方法的正确方法是什么?现在,我只给了Object个方法。我是否为NPCItemEnviromentalObject创建了一个超类?

2 个答案:

答案 0 :(得分:14)

基本上,您可以检查对象是否是特定类的实例。

它可能是这样的:

if( target instanceof NPC) {
    System.out.println("target  is a NPC");
}
else if( Target instanceof Item) {
    System.out.println("target is an Item");
}

if( target  instanceof EnviromentalObject) {

    System.out.println("target is EnviromentalObject"); 
}

编辑:正如我们在评论中所说的那样,我认为您可以更改代码以获得更好的解决方案。上面的代码仍然有效,但使用设计模式是一种非常好的做法,这些被称为编程中的最佳实践。对于这种情况,请考虑使用java接口并定义每个对象可以根据需要实现它们的共享方法。用最简单的方式打印标识符。我们来举个例子:

public interface SceneThings() {

    public void printIdentifire();

    public String doSomeOtherThings();

}

每个对象都可以通过以下方式实现上述接口:

public class Item implements SceneThing {

...

public void printIdentifire(){

//print its identifier here.
System.out.print("ID:ITEM###");

}

public String doSomeOtherThings(){

    //do some other works !!!
}
...
}

与上述相同的其他项目。然后你可以使用一个数组来保存它们而不用担心它们的原始类:

ArrayList<SceneThings> targets = new ...

SceneThing  obj = new Item();
targets.add(obj);

我希望这可以帮助您在您的案例中定义更好的解决方案。

答案 1 :(得分:7)

如何使用它来声明超类或接口Target并使用它来保持目标数组,使用抽象类的完整代码示例:

ArrayList<NPC> npcs = new ArrayList<NPC>();
ArrayList<Item> items = new ArrayList<Item>();
ArrayList<EnviromentalObject> enviromental_objects = new ArrayList<EnviromentalObject>();

ArrayList<Target> targets;

public Target check_for_target(String target_name) {
    targets.addAll(npcs);
    targets.addAll(items);
    targets.addAll(enviromental_objects);
    for (Target target : targets) {
        if (target.toString().equals(target_name)) {
            return target;
        }
    }
    return null;
}

private abstract class Target {}
private class NPC extends Target {}
private class Item extends Target {}
private class EnviromentalObject extends Target {}