我刚刚遇到一个问题,我想在 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
更改为至Map
。 HashMap
是一个类,而 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/