Java - 泛型 - Class"Class <?>"的显式转换和强制转换方法

Vic*_*tor 4 java generics casting effective-java

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

如果你偷看了cast方法,你会发现这个代码:

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
}
Run Code Online (Sandbox Code Playgroud)

如果我做一个通用演员,编译器抱怨说有unchecked warning.


其他背景资料

你可以找到的我如何到达书有效的Java 2版本中这个问题,第166页(的PDF)的例子.

作者写了这段代码

public <T> T getFavorite(Class<T> type) 
{
    return type.cast(favorites.get(type));
}
Run Code Online (Sandbox Code Playgroud)

VS

public <T> T getFavorite(Class<T> type) 
{
    return (T) (favorites.get(type));
}
Run Code Online (Sandbox Code Playgroud)

我只是没有得到差异,为什么编译器抱怨未经检查的警告.最后,两段代码都做了一个明确的演员(T) object,不是吗?

Rad*_*def 7

如果没有@SuppressWarnings("unchecked")注释,源代码java.lang.Class在编译期间产生警告.不会生成警告,因为JDK类位于已编译的库中.我确信自己编译JDK会产生一些警告.

@Bohemian评论说这是一个"官方kludge"本质上是正确的,并且有很多像这样的代码示例.(另一个例子是java.lang.Enum#getDeclaringClass.)使用是安全的,因为编写的逻辑是正确的,它存在,所以你不必自己编写这种丑陋的东西.

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