java - 类 Class<T> 的泛型性质是什么意思?什么是T?

标签 java class generics reflection

当涉及到集合时,我了解泛型。但是在 Class<T> 的情况下是什么意思?类(class)?当你实例化一个 Class对象,只有一个对象。那么为什么 T范围?它具体说明了什么?为什么有必要(如果有的话)?

最佳答案

类型参数<T>已添加到 java.lang.Class启用一个特定的成语1 - 使用 Class对象作为类型安全的对象工厂。本质上,添加 <T>让您以类型安全的方式实例化类,如下所示:

T instance = myClass.newInstance();

类型参数<T>表示类本身,使您能够通过存储 Class<T> 来避免类型删除的不良影响在泛型类中或将其作为参数传递给泛型方法。请注意 T仅靠其本身不足以完成此任务2:T 的类型被删除,所以它变成 java.lang.Object在引擎盖下。

这是一个经典示例,其中 <T>类的参数变得很重要。在下面的示例中,Java 编译器能够确保类型安全,让您从 SQL 字符串和 Class<T> 的实例生成类型化集合。 .请注意,该类用作工厂,并且可以在编译时验证其类型安全性:

public static <T> Collection<T> select(Class<T> c, String sqlStatement) {
    Collection<T> result = new ArrayList<T>();
    /* run sql query using jdbc */
    for ( /* iterate over jdbc results */ ) {
        T item = c.newInstance();
        /* use reflection and set all of item’s fields from sql results */
        result.add(item);
    }
    return result;
}

由于 Java 删除了类型参数,使其成为 java.lang.Object或指定为泛型 upper bound 的类,访问 Class<T> 很重要select 中的对象方法。从 newInstance返回 <T> 类型的对象,编译器可以执行类型检查,消除强制转换。


1 SUN Oracle 已发布 a good article explaining all this .
2 这与没有类型删除的泛型实现不同,例如 .NET 中的实现。
3 Java Generics tutorial甲骨文。

关于java - 类 Class<T> 的泛型性质是什么意思?什么是T?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9406025/

相关文章:

java - 从文件读取时如何将一行保存到链接列表中并将下一行保存到另一个列表中

java - 导入 com.zaxxer.hikari.HikariConfig,无法解析符号,IntelliJ

java - 需要帮助访问嵌入式类中的信息

javascript - Angular:仅在当前单击的按钮上切换事件类(不使用 *ngFor)

python - 在 Python 中标记成员变量

c# - 当模棱两可地使用 IEnumerable 时,Linq 函数会给出奇怪的编译错误 - 可能的解决方法?

java - 使用通用数据类型参数将数组传递给函数

java - 我应该关闭 AWS lambda 内的 Singleton DB 连接对象吗?

java - 如何以编程方式更改主屏幕小部件的形状颜色

c# - 为什么泛型结构不能具有在 C# 中指定泛型类型的静态成员?