Java-泛型-类“ Class <?>”的显式转换和转换方法

胜利者

为什么castClass<?>使用该方法在编译时会产生未经检查的警告?

如果窥视强制转换方法,您会发现以下代码:

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,不是吗?

Radiodef

如果没有@SuppressWarnings("unchecked")注释,的源代码java.lang.Class在编译期间产生警告由于JDK类位于已编译的库中,因此不会产生警告。我相信自己编译JDK会产生一些警告。

@Bohemian的评论本质上是正确的,并且有许多这样的代码示例,这是正确的。(另一个示例是java.lang.Enum#getDeclaringClass。)使用起来很安全,因为编写的逻辑是正确的并且已经存在,因此您不必自己编写这种丑陋的东西。

我的建议是不要对这种实现考虑太多:重要的是要java.lang.Class#cast符合选中的强制转换的语义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java-泛型类的显式方法调用?

来自分类Dev

Java:具有泛型方法的泛型类

来自分类Dev

转换泛型类。(cast)与Class.cast()

来自分类Dev

有没有一种方法可以将类强制转换为具有特定参数的类java.lang.Class <>泛型?

来自分类Dev

Java泛型.class

来自分类Dev

Java泛型转换

来自分类Dev

Java泛型类工厂

来自分类Dev

Java中的泛型类

来自分类Dev

Java泛型:定义泛型类时的通配符和类型参数语法

来自分类Dev

如何在Java中将泛型列表类作为参数传递给泛型方法?

来自分类Dev

将泛型类对象发送到泛型方法(java)

来自分类Dev

如何在Java中将泛型列表类作为参数传递给泛型方法?

来自分类Dev

在泛型类中实例化 Java 泛型类

来自分类Dev

泛型与显式类型类/结构

来自分类Dev

Java泛型改变类的字段和系列化

来自分类Dev

Kotlin 和 Java 中带有嵌套类的泛型

来自分类Dev

如何从泛型方法参数中获取Java类?

来自分类Dev

Java泛型-参数化的类与类型化方法

来自分类Dev

Java泛型方法采用类类型的参数

来自分类Dev

Java-如何创建调用接口方法的泛型类?

来自分类Dev

使用Java泛型接口/抽象类的构造方法

来自分类Dev

从 Java 中的匿名泛型类调用重载方法

来自分类Dev

如何从泛型方法实例化 java 类

来自分类Dev

Java泛型和强制转换泛型类型

来自分类Dev

Java泛型类中的超类

来自分类Dev

java.lang.Class泛型和通配符

来自分类Dev

Java泛型接口转换

来自分类Dev

Java泛型:数组转换

来自分类Dev

Java泛型类型转换