1

我已经阅读了这些页面上有关类强制转换异常的许多其他问题,并且我想确定我的问题本质上是相同的(即与在运行时与编译时相比不知道类的绑定类型有关)。

所以这是我的测试课......

public class testCastReturn{
    public test(){

       HashSet<String> StringHash; //a simple hash set

       HashMap(<String, ComplexObject> ObjectInfo; //the String value is the name of the complexObject, and complexObject has multiple members (in this instance it is a java model for a database field so it has info pertaining to Key, size etc)

       //create a ComplexObject here
       addToObjectInfo(aComplexObject); // add it into the HashMap

       //repeat above a number of times....
       //now collect the 'names' of those objects
       StringHash = getObjectKeys();
    }

    public void addToObjectInfo(complexObject c){
        //put a complex object into the HashMap

        ObjectInfo.put(c.getNameID, c); //create a set of key value pairs where the name of the object is the key to get the actual object
    }

    public HashSet<String> getObjectKeys(){
       //retrieve the keys only
       return HashSet<String> this.ObjectInfo.keySet(); //fails with classCastException
       //this however works
       HashSet<String> temp = new HashSet<String>(this.ObjectInfo.keySet());
       return temp;   
    }  
 }//end class

如果我的理解是正确的,这就是为什么我可以以任何一种形式编译我的代码,但我只能运行我明确创建一个临时位置来保存密钥集的代码,因为作为运行时,JVM 不能保证绑定的类型是什么键将在 ComplexObject 中。请记住,这是人为的版本,所以可能过于简化了,在我的实际代码中,我使用的是“构建器”,然后将信息传递给“最终”类,然后这些类中的一堆被保存在三分之一内具有 ComplexObjects 的 HashMap 的对象。

如果您需要任何进一步的信息,请询问(如果您愿意,我什至可以发送我的图书馆的副本)。

大卫

4

2 回答 2

4

keySet()返回 a Set,而不是HashSet。应该这样return this.ObjectInfo.keySet();做。

经验法则:总是通过接口而不是类来引用集合(和一般的对象)。所以更喜欢ListandSetArrayListand HashSet。仅在实例化对象或需要特定于具体实现的某些功能时才使用具体类型。

于 2012-05-23T12:43:33.527 回答
1
public Set<String> getObjectKeys(){
   return this.ObjectInfo.keySet();
}

这对你有用吗?

于 2012-05-23T12:46:41.023 回答