我已经在这些页面上阅读了许多其他有关类强制转换异常的问题,并且我想确保我的问题本质上是同一件事(即与在运行时和编译时不知道类的绑定类型有关) )。
所以这是我的测试课。
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中。请记住,这是人为设计的版本,因此可能过于简化了,在我的实际代码中,我使用的是“ builder”,然后将信息传递给“ finished”类,然后将其中的一些类保存在第三个类中。具有ComplexObjects的HashMap的对象。
如果您需要任何其他信息,请询问(如果您愿意,我甚至可以发送我的图书馆的副本)。
大卫
最佳答案
keySet()
返回一个Set
,而不是HashSet
。所以return this.ObjectInfo.keySet();
应该做。
经验法则:始终通过其接口而不是其类来引用集合(通常是对象)。因此,相对于List
和Set
,更喜欢ArrayList
和HashSet
。仅在实例化对象或需要特定于具体实现的功能时,才使用具体类型。