-2

当我从哈希中“getValue()”对象时,它属于SomeType,我必须将它转换为 SomeType。JVM 没有将其视为SomeType类型:

JVM对检查该对象是否为实例 SomeType表示正确。该对象上的方法getClass()也返回SomeType

但是,当我尝试将该对象分配给声明为的变量x时

SomeType x; 

我得到错误说

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

我通过将对象转换为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());
}
4

2 回答 2

1

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

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

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

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

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

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

你不必这样做:

Integer value = (Integer)myMap.get("myKey");
于 2013-11-13T03:06:57.657 回答
0

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

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

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

所以你的问题是这样的:

Iterator i = set.iterator();

你需要绑定SomeType到你的迭代器!!!

Iterator<SomeType> i = set.iterator();
于 2013-11-13T03:01:39.037 回答