繁体   English   中英

Java泛型:类型转换问题(ClassCastException)

[英]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 )。 如果不重写getSubSetParameters ,然后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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM