Java泛型Class,别再傻傻分不清!T和Class<T>差了一个宇宙

📅 2026/7/18 4:35:28 👁️ 阅读次数 📝 编程学习
Java泛型Class,别再傻傻分不清!T和Class<T>差了一个宇宙

单独的T, 其代表着一个类型, 该类型的表现形式仅仅是一个类名罢了, 而Class代表着这个类型所对应的类, 此类又能够被称作类实例、类类型以及字节码文件, Class表示的是类型并不确定的类。

Class表示T类型的字节码文件,意思是:

类相当于类c等于T的类, T类型名为t创建一个T的实例对象。

或者Class c= t.();

通过以上可以获取类名为c.();

讲解: 类别ct等于T所属的类, T t通过新建T来创建对象;以及类别c等于T所属的类, T t通过新建T来创建对象。

ct泛型所指的是, ct仅仅能够是T的字节码, 然而c它有可能是任何类的字节码, 所以采用ct用法会更好。

E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定的java类型 举例说明: Set 表示 集合里 是 T类的实例 List 表示 集合里 是 E类的实例 List 表示 集合里的对象类型不确定,未指定 List 同 List 是一样的。 泛型的作用: 1、用泛型: Java代码 收藏代码 List list=new ArrayList(); T t=list.get(0); 2、不用泛型: Java代码 收藏代码 List list=new ArrayList(); T t=(T)list.get(0);

二、如何创建一个Class类型的实例?

就如同运用非泛型代码那般, 存在两种方式, 其一为调用方法Class.(), 其二是使用类常量X.class。Class.()被界定为返回Class。另一方面, 类常量X.class被定义成具备类型Class, 所以.class属于Class类型的。

三、方法中为什么需要 T修饰呢

泛型进行声明的时候, 一定要在方法的修饰符(这儿说的是像final之类的一些修饰符)之后, 可以确定, 要在返回值进行声明的前边。

public static T request2Bean(HttpServletRequest request,Class clazz){}

其中第一个, 它是和传入的参数Class相对应的。另外, 它相当于 返回值的一个泛型。而后, 后面的T是返回值类型, 并且代表方法必须返回T类型的, 而这是由传入的Class决定的。

四、类和Class类

类和Class类没有直接的关系。

一切Java类的父类是类, 对于普通的Java类而言, 就算不进行声明, 其也是默认承袭了类。典型的情况是, 能够运用类之中的()方法。

用于java反射机制的是Class类, 一切java类都有一个对应的Class对象, 它是一个final类, Class类的实例对正在运行的Java应用程序中的类和接口进行表示。

平常在看代码之际, 老是会遇上这些既有着熟悉之感又带着陌生意味的名词之处, 每日都和它们碰面, 然而碰面之后却好像不曾有过任何与之相关联的接触, 于是乎今天我便前来了解一下这两个类似身处江湖中的侠客一般存在的事物的背景情况呢:

CLASS

在Java里头, 每一个class向来都有一个与之对应的Class对象。换言之, 一旦我们着手编写一个类, 待编译完毕之后, 于所生成的.class文件当中, 就会出现一个Class对象, 此对象是用来表示这个类的类型信息的用于表示这个类的类型信息。

获取Class实例的三种方式:

(1)利用对象调用()方法获取该对象的Class实例;

(2)利用Class类内里的静态方法(),借该类得名称把一Class实例给获取到((借助class名字 和 给定的东西。得到实例))。标点这里不知道使用是要干什么规范都按照原有给你放着了 ;这一括号内里句子原句表达属实不严密且包含歧义 我都不好确切翻译 你可以查证下再看看合适不合适。

(3)把运用.class的方式用来获取Class实例, 对于基本数据类型的封装类这边, 还能够采用.TYPE来获取相对应的基本数据类型的Class实例。

通过这样()创建该类的一个实例, 就在()调用类中那种缺省的构造方法, ()可在并不知晓该类名字的时候做到这样。(注!不能出现明显语义相关度近似情况, 不能出现内容重复, 不要使用文言词汇)。

在运行的这个期间当中, 假定我们需要去产生某一个类的对象, 那么Java虚拟机也就是JVM, 它会去检查该种类型的Class对象是不是已经被加载了。要是没有被加载的话,JVM会依据类的名称去找到.class文件并且加载它。一旦某一种类型的Class对象已经被加载到内存里面了, 那么就能够使用它来产生该类型的所有对象。

Class对象的生成方式如下:

1.使用“类名字符串”来指代类, (注意要点来了: 这个类名字符串务必得是全称呐, 也就是包名加上类名二者结合的那种)。

2.类名.class;

3.实例对象.();

五、.()和.class的区别

两者的区别如下:

叫做“类字面量”的、类名.class, 因为class是关键字, 所以类名.class在编译的时候确定。而()是通过某个具体的方法进行调用, 是在运行的时候依据实际实例确定, ()是动态的并且是final的。

例如:

.”.class“是那种凭借对于类名的引用从而于内存里获取该类型class对象引用的情况, 然而"new().()"却是借助实例对象来取得于内存中该实际类型class对象的引用这个状况。