- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
"的显式转换和转换方法-6ren"> "的显式转换和转换方法-为什么使用 cast Class 上的方法类在编译时产生未经检查的警告? 如果你查看 cast 方法,你会发现这段代码: public T cast(Object obj) { if (obj-6ren">
为什么使用 cast
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
}
如果我进行通用转换,编译器会提示说有 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
符合检查转换的语义。
关于Java - 泛型 - 类 "Class<?>"的显式转换和转换方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23862790/
我是一名优秀的程序员,十分优秀!