【问题标题】:Java How to tell which Object is in a HashMapJava 如何判断 HashMap 中的对象
【发布时间】:2017-10-04 12:43:09
【问题描述】:

我有一个 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 name 和ArrayList 的Strings:myObjectList

  2. 还有我的secondObjectClass 对象,它添加了另一个String:quote。

我的问题是,如果我有一个字符串键,请说“ABC”。我知道我可以用containsKey() 方法判断我的HashMap 中是否有一个键“ABC”。但是一旦我找到一个键“ABC”,我如何判断它是anObjectClass 对象还是secondObjectClass 对象?换句话说,我怎样才能知道什么样的对象与该键匹配?提前谢谢你。

【问题讨论】:

  • 获取值并使用instanceof进行检查。
  • 提示:如果你需要使用 instanceof(正确回答你的问题)——你的设计是错误的
  • @Andreas 谢谢!拉沙内是什么意思?
  • 我的意思是我写的 - 你的设计是错误的,你需要重新考虑你的应用程序架构
  • @Lashane 这对我有什么帮助?这就像告诉某人重新开始,而不是告诉他们为什么大声笑

标签: java object inheritance casting hashmap


【解决方案1】:

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

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

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

//不好

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

// 更好

x.doNextThing()

【讨论】:

    【解决方案2】:

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

    在您的示例中,假设您尝试确定对象obj 的类型,该对象是anObjectClass 或secondObjectClass 的实例。您可以使用以下代码来判断类型:

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

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

    【讨论】:

    • 知道了,所以确保我按照正确的顺序进行操作很重要。如果你改变了你写的东西的顺序,并保留了 else if,我会得到一个 ObjectClass 的实例的真实值,即使它可能是第二个 ObjectClass。这将是正确的,但不是我想要的。谢谢!
    • 应该注意的是,使用ìnstanceof 通常是symptom of bad design,几乎总是可以避免。
    • @MickMnemonic 谢谢我认为它会为我的程序完成工作(我希望如此!)。但我以后会尽量避免这种情况,因为时间有点紧。
    【解决方案3】:

    你也可以使用Class类的isAssignableFrom方法。

    所以你的代码看起来像

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

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

    编辑

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

    【讨论】:

    • 不编译。您不能通过对象调用Class 的方法。而且您确实必须担心订单。 BaseClass.class.isAssignableFrom(SuperClass.class) 是真的。
    • 您对订单的评论仍然是错误的。正如我已经说过的,同样的考虑适用于instanceof 和isAssignableFrom()。请注意,我是反对者,我确实指出了你的错误。
    • @EJP 你仍然没有得到它。我知道 if(//here) 里面的顺序很重要。我在谈论 instanceof 的问题,isAssiganbleFrom 不存在该问题,因为类型是可传递的。
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多