为什么在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
符合已检查的强制转换的语义。