Java如何判断哪个Object在HashMap中

时间:2017-05-05 23:22:35

标签: java object inheritance casting hashmap

我有一个HashMap:

HashMap<String, anObjectClass> myHash = new HashMap<String, anObjectClass>();

我有anObjectClass

public class anObjectClass {
    private String name;
    private ArrayList<String> myObjectList = new ArrayList<String>();
}

我有另一个扩展我的anObjectClass的类,它添加了另一个字符串:

public class secondObjectClass extends anObjectClass {
String quote;
}

这意味着我的HashMap中有两种对象:

  1. 我的anObjectClass个对象String nameArrayList StringsmyObjectList

  2. 我的secondObjectClass个对象增加了另一个Stringquote

  3. 我的问题是,如果我有一个String键,请说&#34; ABC&#34;。我知道我能说出是否有钥匙&#34; ABC&#34;在我的HashMap中使用containsKey()方法。但是一旦我找到了一个键&#34; ABC&#34;,我如何判断它是anObjectClass个对象还是secondObjectClass个对象?换句话说,如何判断哪种对象与该键匹配?提前谢谢。

3 个答案:

答案 0 :(得分:2)

对于您控制定义的对象,请定义一个布尔值

  boolean isBaseClass() { return(true); }
and in the subclass define
  boolean isBaseClass() { return(false): }

但更一般地说,使用方法继承而不是这种测试, 因为它可以扩展到任何类别的家庭。

//坏

if(x.isBaseClass()) { doThis(); } else { doThat(); }

//更好

x.doNextThing()

答案 1 :(得分:1)

您可以使用关键字instanceof来确定Java中不同对象的类型。

在您的示例中,假设您要确定对象obj的类型,该对象是anObjectClasssecondObjectClass的实例。您可以使用以下代码告诉类型:

if(obj instanceof secondObjectClass) {
    // obj is of type secondObjectClass
} else if(obj instanceof anObjectClass) {
    // obj is of type anObjectClass
}

这很好,但要注意 - 类型是传递。也就是说,secondObjectClass的实例也是anObjectClass类型的实例,因为它是它的子类。因此,在使用instanceof时尽可能具体。

答案 2 :(得分:0)

您还可以使用isAssignableFrom类的Class方法。

所以你的代码看起来像

if(obj.getClass().isAssignableFrom(BaseClass.class)) {
    //bla
}

if(obj.getClass().isAssignableFrom(SuperClass.class)) {
    //blabla
}

我喜欢这个,因为我不必担心if else的顺序,也不需要在elses上编写嵌套。

修改

按顺序我的意思是在使用instanceof时,你的if elses必须以在检查基类instanceof之前检查子类的方式放置。很抱歉造成任何混淆。谢谢@EJP指出。