【发布时间】:2016-09-24 20:14:26
【问题描述】:
这是我的 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 的方法。我要为NPC、Item 和EnviromentalObject 创建超类吗?
【问题讨论】:
-
旁白:
if (target.toString() == target_name){--> 那条线会给你带来一些麻烦。对对象使用 .equals()。 -
您可以使用
instanceof关键字来检查对象的类型。 -
不是您的问题的答案,而是更笼统的...您使用的是
List的Items,这是与您选择的ArrayList的列表实现不同的问题,所以你应该声明List<Item> items = new ArrayList<>();——还要注意你不必在右边重复<Item>。这样,如果您以后决定LinkedList效果更好,您就不必重新声明所有内容。 -
虽然使用
instanceof确实发现了类型,但它是一种非OO 的工作方式——它破坏了封装;它打破了多态性。这是对“Java 从对象到子类的转换” 的正确答案,但这是一种糟糕的方法。学习使用接口。也许 NPC、Item 和 EnvironmentalObject 都是Targetable,而 NPC 和 Item 是Moveable而 EnvironmentalObject 不是。然后findTarget(target_name)将返回Targetable而不是Object。 -
定义
treat it as its true type。你想用它做什么?
标签: java class oop inheritance types