博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 泛型class<T>
阅读量:7115 次
发布时间:2019-06-28

本文共 1184 字,大约阅读时间需要 3 分钟。

hot3.png

类 Class 已经泛型化了,但是很多人一开始都感觉其泛型化的方式很混乱。Class<T> 中类型参数 T 的含义是什么?事实证明它是所引用的类接口。怎么会是这样的呢?那是一个循环推理?如果不是的话,为什么这样定义它?

在以前的 JDK 中,Class.newInstance() 方法的定义返回 Object,您很可能要将该返回类型强制转换为另一种类型:

class Class {
Object newInstance();
}

但是使用泛型,您定义 Class.newInstance() 方法具有一个更加特定的返回类型:

class Class<T> {
T newInstance();
}

如何创建一个 Class<T> 类型的实例?就像使用非泛型代码一样,有两种方式:调用方法 Class.forName() 或者使用类常量X.class。Class.forName() 被定义为返回 Class<?>。另一方面,类常量 X.class 被定义为具有类型 Class<X>,所以 String.class 是Class<String> 类型的。

让 Foo.class 是 Class<Foo> 类型的有什么好处?大的好处是,通过类型推理的魔力,可以提高使用反射的代码的类型安全。另外,还不需要将 Foo.class.newInstance() 强制类型转换为 Foo。

考虑一个方法,它从数据库检索一组对象,并返回 JavaBeans 对象的一个集合。您通过反射来实例化和初始化创建的对象,但是这并不意味着类型安全必须完全被抛至脑后。考虑下面这个方法:

public static<T> List<T> getRecords(Class<T> c, Selector s) {
// Use Selector to select rows
List<T> list = new ArrayList<T>();
for (/* iterate over results */) {
T row = c.newInstance(); // use reflection to set fields from result
list.add(row);
}
return list;
}

可以像下面这样简单地调用该方法:

List<FooRecord> l = getRecords(FooRecord.class, fooSelector);

编译器将会根据 FooRecord.class 是 Class<FooRecord> 类型的这一事实,推断 getRecords() 的返回类型。您使用类常量来构造新的实例并提供编译器在类型检查中要用到的类型信息。

转载于:https://my.oschina.net/u/1398304/blog/301257

你可能感兴趣的文章
Bootstrap学习笔记系列5------Bootstrap图片显示
查看>>
CentOS服务器下对mysql的优化
查看>>
linux内核模块开发
查看>>
android 小结
查看>>
【转】Android 基于Socket的聊天室
查看>>
小记录
查看>>
ubuntu安装完无法用xshell,远程链接
查看>>
C# 对象哈希码
查看>>
高效的JS数组操作
查看>>
Oracle计算时间差函数
查看>>
Jenkins入门系列之——01第一章 Jenkins是什么?
查看>>
在Ubuntu上搭建hive环境
查看>>
二分法查找
查看>>
hmac检验客户端合法性
查看>>
python-webbrowser模块 浏览器操作
查看>>
map侧连接
查看>>
数据库---数据库查询的各种子句
查看>>
vue+Mint-ui实现登录注册
查看>>
asp.net记住我功能
查看>>
[java web]Idea+maven+spring4+hibernate5+struts2整合过程
查看>>