[英]Generics: ClassCastException: java.lang.Object[] cannot be cast to
[英]Java Generics: Type cast issue (ClassCastException)
我在弄清楚如何正确地将java中的通用对象转换为扩展通用对象的类型时遇到了麻烦。
例如,说我进行如下设置:
public class Parameters extends SomeCustomMap<String, String>
{
...
}
public class SomeCustomMap<K, V> implements Map<K, V>
{
public SomeCustomMap<K, V> getSubSet(...)
{
SomeCustomMap<K, V> subset;
...
return subset;
}
}
class ExampleApp
{
private void someMethod()
{
Parameters params;
Parameters paramsSubSet;
try
{
...
paramsSubSet = (Parameters) params.getSubSet(...);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
运行与上面类似的代码始终会引发ClassCastException,而我对此不太了解。 任何对如何正确设置类似于上述情形的帮助将不胜感激! 即,如何正确地将params.getSubSet(...)方法返回的SomeCustomMap对象转换为Parameters对象?
提前致谢!
您的问题是getSubSet返回的子集是SomeCustomMap实例的实例,而不是Parameters的实例。
此问题不涉及泛型。 如果不使用泛型,则会遇到相同的问题。
我不知道如何创建子集的实例,但也许可以使用模板设计模式和一些泛型来解决问题。
尽管我已评论要求提供更多信息,但是基于您到目前为止发布的内容,我认为getSubSet
正在构造SomeCustomMap
以便在某处返回(带有new SomeCustomMap
)。 如果不重写getSubSet
的Parameters
,然后Parameters.getSubset
将返回一个SomeCustomMap
(基类),而不是一个Parameters
,所以你的类型强制转换为Parameters
失败。
( getSubSet
提示,如果您覆盖Parameters
类中的getSubSet
,则可以将返回类型更改为Parameters
并避免进行类型转换。)
泛型与铸造本身没有任何关系(由于擦除的性质,泛型参数在铸造期间无法检查)。
如果在这种情况下收到ClassCastException
,则意味着返回的对象实际上不是Parameters
的实例。 就在您投放之前,尝试致电
System.out.println(params.getSubSet(...).getClass());
并查看子集的实际运行时类是什么。 问题可能出在其他地方,因为您期望子集是Parameters对象,在运行时几乎肯定是不正确的-它是SomeCustomMap
或它的某些其他子类。
您可以尝试如下操作:
public <T extends SomeCustomMap<K, V>> T getSubSet(...){
T subset = (T)this.clone();
subset.clear();
return subset;
}
创作看起来有点有趣-随时将其更改为您想要的任何东西:)
作为奖励,您无需投放:)
paramsSubSet = params.getSubSet(...)
正如其他人所解释的那样,问题在于您正在getSubSet()
中构造的实际对象不是Parameters
的实例。
这是一种可能的解决方法。 我不喜欢它,但是它是在SomeCustomMap
声明该方法的一种方法,但是可以为任何子类正确键入其返回值。
public static <T extends SomeCustomMap<K, V>> getSubSet(T fullSet)
{
T subset;
... (use fullSet instead of this)
return subset;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.