2

我无法弄清楚如何正确地将 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 对象转换回参数对象?

提前致谢!

4

5 回答 5

2

您的问题是 getSubSet 返回的子集是实例 SomeCustomMap 而不是参数。

这个问题不涉及泛型。如果您不使用泛型,您将遇到同样的问题。

我不知道您如何创建子集的实例,但也许您可以使用模板设计模式和一些泛型来解决您的问题。

于 2010-11-16T15:23:43.213 回答
1

尽管我评论过要求提供更多信息,但根据您迄今为止发布的内容,我认为getSubSet正在构建一个 SomeCustomMap返回 (with new SomeCustomMap) 某处。如果您不覆盖getSubSetin ParametersParameters.getSubset则将返回 a SomeCustomMap(基类),而不是 a Parameters,因此您的类型转换Parameters失败。

(热点提示,如果你getSubSetParameters类中重写,你可以将返回类型更改为Parameters并避免类型转换。)

于 2010-11-16T15:22:16.970 回答
1

泛型本质上与强制转换没有任何关系(除了由于擦除的性质,在强制转换期间无法检查泛型参数)。

如果ClassCastException在这种情况下得到 a ,则意味着返回的对象确实不是Parameters. 就在你施法之前,试着打电话

System.out.println(params.getSubSet(...).getClass());

并查看子集的实际运行时类是什么。问题可能出在其他地方,因为您对子集是 Parameters 对象的期望在运行时几乎肯定是不正确的——它是它的一个SomeCustomMap其他子类。

于 2010-11-16T15:24:54.820 回答
1

你可以尝试这样的事情:

public <T extends SomeCustomMap<K, V>> T getSubSet(...){
    T subset = (T)this.clone();
    subset.clear();

    return subset;
}

创作看起来有点有趣 - 随意将其更改为您想要的任何内容:)

作为奖励,您不需要投射:)

paramsSubSet = params.getSubSet(...)
于 2010-11-16T15:40:04.263 回答
0

正如其他人所解释的那样,问题在于您正在构建的实际对象getSubSet()不是Parameters.

这是一种可能的解决方法。我不喜欢它,但它是一种声明方法的方法,SomeCustomMap但可以为任何子类正确输入其返回值。

public static <T extends SomeCustomMap<K, V>> getSubSet(T fullSet)
{
    T subset;

    ... (use fullSet instead of this)

    return subset;
}
于 2010-11-16T15:59:44.007 回答