Java中HashMap值对象的类型

时间:2013-11-13 02:58:19

标签: java hashmap

当我'getValue()'来自哈希的 SomeType 对象时, 我不得不把它投射到SomeType。 JVM并未将其视为 SomeType

类型

JVM说 true 检查对象是否为实例SomeType 。 该对象上的方法 getClass()也返回 SomeType

但是,当我尝试将该对象分配给声明为

的变量 x
SomeType x; 

我收到错误说

Type mismatch: cannot convert from Object to A.SomeType. 

我通过将对象强制转换为 SomeType 来解决它,这没关系。

但是,这是常规 - 我为什么要投射一个物体 - 一个以 SomeType 为生命的物体 首先,在 HashMap 中度过一段时间之后回到 SomeType

// =====

ADD:代码。

下面的这个给出了错误。评论“这线工作”的线是一个铸造和工作。

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());
}

2 个答案:

答案 0 :(得分:1)

Java泛型允许您使用它将存储的实际对象类型定义集合。在Java的旧版本中(我相信之前的Java5),所有集合都用于存储原始类型对象,因此每次都需要对实际对象进行转换。但是使用泛型,你可以使用实际类型定义你的集合,编译器不会让你在其中放入任何其他类型。因此,您可以定义类型为String的键的HashMap和类型为Integer的值,如下所示:

Map<String,Integer> myMap = new HashMap<String, Integer>();

Java 7中对这个概念的进一步改进,现在你不需要在声明中定义两次类型,所以这在Java 7中更清晰地定义相同的Map:

Map<String,Integer> myMap = new HashMap<>();

现在使用泛型,您不必将值转换为Integer,因此这将起作用:

Integer value = myMap.get("myKey");

你不必这样做:

Integer value = (Integer)myMap.get("myKey");

答案 1 :(得分:0)

如果您声明HashMap没有有界键/值类型,那么在查询时您将获得原始Object。这将要求您对您的类型进行显式转换(不好)

如果您想利用多态方面,则需要将类型绑定到声明:

Map<TypeA, TypeB> map = new HashMap<TypeA, TypeB>();

所以你的问题是:

Iterator i = set.iterator();

您需要将SomeType绑定到迭代器!!!

Iterator<SomeType> i = set.iterator();