java class<t> 报错t类型_JAVA 泛型 - Class<T>

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

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

Object newInstance();

}

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

T newInstance();

}

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

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

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

// Use Selector to select rows

Listlist = new ArrayList();

for (/* iterate over results */) {

T row = c.newInstance();

// use reflection to set fields from result

list.add(row);

}

return list;

}

可以像下面这样简单地调用该方法:Listl = getRecords(FooRecord.class, fooSelector);

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

吃肥皂吐泡沫

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值