Java中HashMap值对象的类型
当i'getValue()'从散列中选择属于SomeType的对象时, 我得把它扔给什么人。JVM是&;没有将其视为类型某个类型:
JVM对检查对象是否为实例SomeType说true。 该对象上的方法getClass()也返回SomeType
但是,当我尝试将该对象分配给声明为
SomeType x;
我得到的错误是
Type mismatch: cannot convert from Object to A.SomeType.
我通过将对象投射到SomeType来绕过它,这样就可以了
但是,这是一个惯例吗?为什么我必须投射一个对象?一个以某种类型出现的对象 首先,在HashMap中花了一段时间后,返回到SomeType
//================
加:代码
下面这一条给出了错误。带有注释的行“此行有效”是铸造和工作的行
class SomeType {
private int value;
public void setValue (int value) { this.value = value; }
public int getValue () { return this.value; }
}
void doThis(int[] input) {
LinkedHashMap<Integer, SomeType> anElt = new LinkedHashMap<>();
for (Integer key:input) {
SomeType h = new SomeType();
if (anElt.containsKey(key)) {
h = anElt.get(key);
// trimmed off the rest -- nothing relevant here
} else {
h.setValue(key); // ...
}
anElt.put(key, h);
}
Set set = anElt.entrySet();
Set<SomeType> outSet = new LinkedHashSet<SomeType> ();
// Get an iterator
Iterator i = set.iterator();
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey() + ": ");
// SomeType h = (SomeType)(me.getValue()); // THIS LINE WORKS. -- not the one after.
SomeType h = me.getValue();
System.out.println(h.getValue());
}
# 1 楼答案
如果您声明的
HashMap
没有有界键/值类型,那么在查询时将得到一个原始的Object
。这将要求您对您的类型执行显式转换(不好)如果要利用多态特性,需要将类型绑定到声明:
所以你的问题是:
您需要将
SomeType
绑定到迭代器# 2 楼答案
Java泛型允许您使用将要存储的对象的实际类型定义集合。在旧版本的Java中(我相信在Java5之前),所有集合都用于存储原始类型对象,因此每次强制转换都需要对实际对象执行。但使用泛型,您可以用实际类型定义集合,编译器不允许您在其中放入任何其他类型。因此,您可以定义String类型的键和Integer类型的值的HashMap,如下所示:
Java 7对此概念的进一步改进,现在您不需要在声明中定义两次类型,因此在Java 7中定义相同映射的方式更简洁:
现在使用泛型,您不必将值强制转换为整数,因此这将起作用:
您不必这样做: