java - 调用HashMap的 'dynamic'对象

标签 java hashmap

我刚刚遇到一个问题,我想在 HashMap 中调用对象的函数。我已经搜索过并找到了一条线索,但遗憾的是我不明白。

这是我的代码

public class Seat {

  //some attributes

  public int getNumber() {
     return number;
  }
  public boolean isReserved() {
     return status;
  }
}

public class Hall {

  private HashMap mySeats;

  public HashMap getMeinePlaetze() {
      return meinePlaetze;
  }
  public void createSeats() {
      for (int i = 1; i <= this.getnumberOfSeats(); i++) {
        this.getMySeats().put(i, new Seat(i, 1));
      }
   }
}
public class Main {
  Hall h1 = new Hall(...);

  h1.createSeats();

  h1.getMySeats().get(2).isReserved();  //How do I have to write this to work out? 
}

我希望我的意图是合理的。如果我的代码很糟糕,请随时纠正我。我已经为此道歉了。

非常感谢。

最佳答案

从版本 5 开始,Java 有一个名为泛型的功能。您会在网络上找到很多有关泛型的信息,从文章、博客文章等到 StackOverflow 上的非常好的答案。

泛型让 Java 成为一种强类型语言。这意味着 Java 中的变量不仅可以声明为某种类型(即 HashMap ),还可以声明为某种类型以及一个或多个泛型类型参数(即 HashMap<K, V> ) ,其中K表示映射键的类型参数,V表示映射值的类型参数。

在您的示例中,您使用的是原始 HashMap (原始类型是允许指定泛型类型参数的类型,但开发人员尚未指定它们)。原始类型被认为是不好的做法,并且很容易出错,正如您现在所经历的那样。

HashMap允许两个泛型类型参数(一个用于键,另一个用于值)。在您的情况下,您正在使用 Integer对于按键和 Seat对于值(value)观。简单来说,你正在将整数映射到座位,或者你也可以说你的 map 是整数到座位的映射。

所以,在你的内心Hall类,您应该使用其泛型类型参数定义您的 map :

private Map<Integer, Seat> mySeats = new HashMap<>();

然后,这段代码:

h1.getMySeats().get(2)

将返回 Seat 类型的实例,因为您的 map 已经知道它的所有值都是 Seat 类型.

所以你的代码:

h1.getMySeats().get(2).isReserved();

可以正常编译并且不会出现任何错误。

请注意,除了声明 map 的通用类型之外,我还更改了另外两件事。

首先,我创建了 HashMap 的实际实例通过使用它的构造函数:

mySeats = new HashMap<>()

如果您不使用new创建您的类型的实例,不会有 HashMap例如稍后将座位放在哪里,您将得到 NullpointerException (尝试一下!)。

其次,我将变量的类型从 HashMap 更改为至MapHashMap是一个类,而 Map只是一个接口(interface)。问题是 HashMap类实现 Map接口(interface),因此,除非您的代码明确需要访问 HashMap 的方法Map 中未声明的内容界面(几乎从来没有这种情况),你会很好地使用 mySeats变量类型为Map<Integer, Seat>而不是HashMap<Integer, Seat> 。这称为接口(interface)编程,并且是您应该从一开始就采用的最佳实践。这将为您在将来省去很多麻烦。

关于java - 调用HashMap的 'dynamic'对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47601993/

相关文章:

java - 如何将Java编译成32位?

java - 避免使用 freeMarker 模板创建的 html 表中的数据重复

ruby - 为什么在 Ruby 中使用符号作为哈希键?

java - Ecore 建模生成一个 HashMap dto 持有一个 HashMap

java - 优化 portlet 首选项的性能

java - 序列号的模式匹配算法

java - 如何向已排序的链表添加元素?

java - Maven Jdepend 报告不包含任何数据

java - Python 等同于 Java 中的 concurrentHashMap?

java - 为什么key的hashcode有大于等于小于等于三种情况,为什么会出现其他情况?