"的显式转换和转换方法-6ren"> "的显式转换和转换方法-为什么使用 cast Class 上的方法类在编译时产生未经检查的警告? 如果你查看 cast 方法,你会发现这段代码: public T cast(Object obj) { if (obj-6ren">
gpt4 book ai didi

Java - 泛型 - 类 "Class"的显式转换和转换方法

转载 作者:搜寻专家 更新时间:2023-11-01 01:43:01 25 4
gpt4 key购买 nike

为什么使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com