为什么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
符合选中的强制转换的语义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句