Vic*_*tor 4 java generics casting effective-java
为什么cast
在Class<?>
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
,不是吗?
如果没有@SuppressWarnings("unchecked")
注释,源代码java.lang.Class
将在编译期间产生警告.不会生成警告,因为JDK类位于已编译的库中.我确信自己编译JDK会产生一些警告.
@Bohemian评论说这是一个"官方kludge"本质上是正确的,并且有很多像这样的代码示例.(另一个例子是java.lang.Enum#getDeclaringClass
.)使用是安全的,因为编写的逻辑是正确的,它存在,所以你不必自己编写这种丑陋的东西.
我的建议是不要过多考虑这个实现:重要的是java.lang.Class#cast
符合已检查的强制转换的语义.