有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中HashMap值对象的类型

当i'getValue()'从散列中选择属于SomeType的对象时, 我得把它扔给什么人。JVM是&;没有将其视为类型某个类型

JVM对检查对象是否为实例SomeTypetrue。 该对象上的方法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());
}

共 (2) 个答案

  1. # 1 楼答案

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

    如果要利用多态特性,需要将类型绑定到声明:

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

    所以你的问题是:

    Iterator i = set.iterator();
    

    您需要将SomeType绑定到迭代器

    Iterator<SomeType> i = set.iterator();
    
  2. # 2 楼答案

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

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

    Java 7对此概念的进一步改进,现在您不需要在声明中定义两次类型,因此在Java 7中定义相同映射的方式更简洁:

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

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

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

    您不必这样做:

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