为什么在cast类上使用Class<?>方法会在编译时产生未经检查的警告?

如果您查看强制转换方法,您会发现以下代码:

public T cast(Object obj)
{
    if (obj != null && !isInstance(obj))
        throw new ClassCastException(cannotCastMsg(obj));
    return (T) obj; // you can see there is a generic cast performed here
}

如果我进行泛型转换,则编译器会抱怨说存在unchecked warning

其他背景信息

您可以在Book Effective Java 2版本,第166页(pdf)中找到有关我如何解决此问题的示例。

作者编写这段代码
public <T> T getFavorite(Class<T> type)
{
    return type.cast(favorites.get(type));
}


public <T> T getFavorite(Class<T> type)
{
    return (T) (favorites.get(type));
}

我只是没有区别,为什么编译器会抱怨未检查的警告。最后,这两段代码都进行了显式的强制转换(T) object,不是吗?

最佳答案

没有@SuppressWarnings("unchecked")批注,java.lang.Class的源代码将在编译过程中产生警告。由于JDK类位于已编译的库中,因此不会产生警告。我相信自己编译JDK会产生一些警告。

@Bohemian的评论本质上是正确的,并且有许多这样的代码示例,这是正确的。 (另一个示例是java.lang.Enum#getDeclaringClass。)使用起来很安全,因为编写的逻辑是正确的并且已经存在,因此您不必自己编写此类丑陋的东西。

我的建议是不要对这种实现考虑太多:重要的是java.lang.Class#cast符合已检查的强制转换的语义。

08-18 07:18
查看更多