Class<T>
类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()的返回类型。您使用类常量来构造新的实例并提供编译器在类型检查中要用到的类型信息。
分享到:
相关推荐
主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
6.成员变量和成员方法前加...9.有一个泛型类class List<T>{},则正确实例化该泛型类的语句是( )。 A)List t=new List(); B)List t=new List<T>; C)List<T> t=new List<T>(); D)List<int> t=new List<int>();
class Point<T> class Notepad<K,V>{ // 此处指定了两个泛型类型 } 通配符、受限泛型、泛型无法向上转型、泛型接口、泛型方法、通过泛型方法返回泛型类型实例、使用泛型统一传入的参数类型、泛型数组、泛型的嵌套...
"Java泛型枚举与For语句的简化写法PPT教案学习" 以下是根据给定的文件信息生成的相关知识点: 一、泛型枚举 泛型枚举是Java中的一种枚举类型,它允许在枚举类型中定义泛型参数。泛型枚举可以使枚举类型更加灵活和...
例如,`public class Test2<T> { public static T one; public static T show(T one){ return null; } }`编译错误。这是因为泛型类中的泛型参数的实例化是在定义泛型类型对象(例如`ArrayList<Integer>`)的时候指定...
public class MyExpection<T> extends Exception{ } //编译错误 可以抛出(throws)泛型类,但catch的参数不能是泛型类。 注意: 编译时类型的泛型和运行时类型的泛型一定要一致,没有多态。 ...
public class GenericHibernateDaoImpl<T> implements GenericDao<T> { private Class<T> clazz; @SuppressWarnings("unchecked") public GenericHibernateDaoImpl() { // 通过反射获取 T 的类型信息实例 this...
閱讀本文之前,如果自覺基礎不夠,可以補充閱讀適才提到的《Java泛型技術之 發展》,那是一篇非常完整的文章,可助您完整認識泛型技術的來龍去脈。 Sun JDK的泛型發展歷史要從 1.3版說起。該版本配合 GJ,正式...
Java泛型指南中文版 Java 1.5 泛型指南中文版是一个详细的Java泛型教程,涵盖了Java泛型的各个方面。下面是该教程的知识点摘要: 1. 介绍:Java 1.5 中引入了泛型(generics),允许对类型进行抽象(abstract over...
泛型daoimpl :GenericDaoImpl<T, ID extends Serializable> implements GenericDao<T, ID> 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型。 daoimpl :PersonDAOImpl extends GenericDaoImpl...
泛型类: class ClassName<T>{} 泛型方法:public <T> void f(T x){} 基本指导原则:如果使用泛型方法可以取代将整个类泛型化,那么应该使用泛型方法,因为它可以让事情更加清楚。 2.为什么使用泛型? ...
打字工具 一个简单的零依赖库,用于处理类型。 支持Java 1.6+和Android。介绍Java的痛处之一涉及...[] resolveRawArguments(Class<T> type, Class<S> subType) 使用来自subType类型变量信息来解析type的原始参数。 Clas
} //主题泛型接口 ISubject public interface ISubject<T>{ public void register(IObserver<T> obs); public void unregister(IObserver<T> obs); public void notifyObservers(); } 当把 ISubject、IObserver ...
泛化 适用于 Android 的 Gradle 插件,可让您在 XML 布局中使用 Java 泛型。 用法 在常规“android”插件之后应用build.gradle的插件: buildscript { ... public class AwesomeView <T> extends TextVi
泛型daoimpl :GenericDaoImpl<T, ID extends Serializable> implements GenericDao<T, ID> 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型。 daoimpl :PersonDAOImpl extends GenericDaoImpl...
HttpRequest.reqquest(int,String,Parse<T>,Class<T>){....}; >原生string文本请求: HttpRequest.getString(String,AqsString){...} >单张图片请求: HttpRequest.setImage(ImageView,String,int,int){...} >多...
其中,类型参数(Type Parameter)是指在类定义中使用尖括号<>括起来的参数,它可以是任何合法的Java标识符。 2. 泛型的接口定义格式 泛型的接口定义格式如下: ``` [ 类修饰词 ] interface 接口名 < 类型参数 1, ...
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。 5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(java.lang.String); 例子: a..使用...
public static T(返回值类型) 方法名(一个对应泛型的参数) { //方法体 } 自定义的泛型声明在返回值之前,保证返回值以及参数都可以使用自定义的泛型。 在方法上定义的泛型,需要通过调用方法时通过给定的参数来...
目录一、泛型概述二、泛型定义(1)泛型类(2)泛型方法2.1 泛型可变参数(3)泛型接口(4)类型限定三、泛型使用(1)类型通配符1.1 上限1.2 下限四、泛型擦除五、泛型数组 一、泛型概述 泛型,即是参数化类型。在...