Java 中,类、类对象、泛型之间的转换

  • R 为非泛型
    • 获得类
      • 通过类型名来获得类
      • 通过对象来获得类
      • 通过类名字符串来获得类
    • 通过类来获得类名字符串
    • 通过类来获得对象
      • 使用 R 的无参数构造器来创建对象
      • 使用 R 的有参数构造器来创建对象
  • T 为泛型
    • 通过泛参来得到 Class 对象
    • 通过泛参来创建实例对象
    • 通过泛型非空引用来得到 Class 对象
    • 通过 Class 对象来得到泛参
    • 通过 Class 对象来创建实例对象
      • 使用 T 的无参数构造器来创建对象
      • 使用 T 的有参数构造器来创建对象

R 为非泛型

  这里说的类是指某个对象所属的类所对应的类 Class<?> 的对象。

获得类

通过类型名来获得类

  已有某类的一个类型名 R(R不是泛型形参,而是某个具体的类型名),来得到该类名字符串所对应的类 Class<R> 的对象:

// “通过类型名来获得类”
Class<R> targetClass = R.Class; // 这里 R 不是泛型形参,而是某个具体的类型名

通过对象来获得类

  已有一个类型名为 R(R不是泛型形参,而是某个具体的类型名)的对象,来得到该对象所属的类所对应的类 Class<R> 的对象:

// rObject 为已有对象,函数 getRObject 代表一个返回类 R 对象的函数
R rObject = getRObject();// “通过类对象来获得类”
Class<R> targetClass = rObject.getClass();

通过类名字符串来获得类

  已有类 R 的类名字符串,来得到该类名字符串所对应的类 Class<R> 的对象:

// className为已有类名字符串,函数 getClassRName 代表一个返回一个类名字符串的函数
String className = getClassRName();// “通过类名字符串来获得类”
Class<R> targetClass = Class.forName(className);

通过类来获得类名字符串

  已有某类所对应的 Class<R> 对象,来得到该类类名:

// classR 为已有 Class 对象,函数 getClassR 代表一个返回 R 类对象的函数
Class<R> classR = getClassR();// “通过类来获得类名字符串”
String className = classR.getName();

通过类来获得对象

  已有一个 Class<R> 对象,来得到一个类型为R的对象:

使用 R 的无参数构造器来创建对象

// classR 为已有 Class 对象,函数 getClassR 代表一个返回 R 类对象的函数
Class<R> classR = getClassR();// “通过类来获得类对象”:使用 R 的无参数构造器来创建对象
Object targetObj = classR.getConstructor().newInstance();

使用 R 的有参数构造器来创建对象

  设 R 的某个构造器的参数分别为类A、类B的对象。类 A、类 B 均有公有的无参数构造器,且 A、B 均不是泛型(变量):

// classR 为已有 Class 对象,函数 getClassR 代表一个返回 R 类对象的函数
Class<R> classR = getClassR();// “通过类来获得类对象”:使用 R 的有参数构造器来创建对象
Object targetObj = classR.getConstructor(A.class, B.class).newInstance(aObject, bObject);

T 为泛型

通过泛参来得到 Class 对象

  已有泛型变量 T,来得到对应的 Class<T> 对象:
  没有这种办法。必须通过外部主动提供泛型变量 T 的已实例化的对象,才能得到对应的 Class<T> 对象。因为类型擦除等原因,以下这几种都是错误的:

  • 错误示例1:
// 设 T 为已被“赋值”的泛型变量
Class<T> targetClass = T.class; // 因为类型擦除,所以 T.class 会退化为 Object.class
  • 错误示例2:
// 设 T 为已被“赋值”的泛型变量
Class<T> targetClass; // 使用这种方法创建的只是一个空引用

通过泛参来创建实例对象

  已有泛型变量 T,来得到对应的类型为 T 的对象:
  没有这种办法。必须通过泛型变量 T 对象的 Class<T> 对象,才能得到对应的类型为 T 的对象。因为类型擦除等原因,以下这几种都是错误的:

  • 错误示例1:
// 设 T 为已被“赋值”的泛型变量
T targetObject = new T(...); // 因为类型擦除,所以 new T(...) 会退化为 new Object(...)
  • 错误示例2:
// 设 T 为已被“赋值”的泛型变量
T targetObject; // 使用这种方法创建的只是一个空引用

通过泛型非空引用来得到 Class 对象

  已有泛型变量 T 的非空引用,来得到对应的 Class<T> 对象:

// T 为泛型类中设置的泛型变量,函数 getRObject 代表一个返回类 R 对象的函数
T genericObject = getRObject();// “通过泛型非空引用来得到 Class 对象”
Class<T> targetClass = (Class<T>) genericObject.getClass();

通过 Class 对象来得到泛参

  已有 Class<T> 对象,来取出其中的泛型形参 T:(不过,由于 Java 中的类型擦除,一般得到泛型变量没什么用。)

// “通过 Class 对象来得到泛型变量”
// classT 为已有 Class 对象,函数 getClassT 代表一个返回 Class 对象的函数
Class<T> classT = getClassT(); // 现在,T 即为需要的泛型变量

通过 Class 对象来创建实例对象

  已有 Class<T> 对象,来得到对应的类型为 T 的对象:

使用 T 的无参数构造器来创建对象

// classT 为已有 Class 对象,函数 getClassT 代表一个返回 Class 对象的函数
Class<T> classT = getClassT(); // “通过类来获得类对象”:使用 T 的无参数构造器来创建对象
Object targetObj = someClass.getConstructor().newInstance();

使用 T 的有参数构造器来创建对象

  设 T 的某个构造器的参数分别为类 A、类 B 的对象。类 A、类 B 均有公有的无参数构造器,且 A、B 均不是泛型(变量):

// classT 为已有 Class 对象,函数 getClassT 代表一个返回 Class 对象的函数
Class<T> classT = getClassT();
// aObject 为已有对象,函数 getFirstParameter 代表一个返回 A 对象的函数
A aObject = getFirstParameter();
// bObject 为已有对象,函数 getSecondParameter 代表一个返回 B 对象的函数
B bObject = getSecondParameter();// “通过类来获得类对象”:使用 T 的有参数构造器来创建对象
Object targetObj = classT.getConstructor(A.class, B.class).newInstance(aObject, bObject);

Java 中,类、类对象、泛型之间的转换相关推荐

  1. Java中byte[]数组和int之间的转换

    在最近的项目中需要用到byte[]和int互转,找了一些资料选了其中感觉蛮不错的一种解决方法记录一下. 转自:http://blog.csdn.net/sunnyfans/article/detail ...

  2. java中实现十六进制和十进制之间的转换

    public static void main(String[] args) {//16进制转十进制String str = "060A04000000C2";int num= I ...

  3. java中几种基本数据类型之间的转换

    int类型转字符串 int a = 10 ; String str = a+""; int a = 10; String str = Integer.toString(a); in ...

  4. java中IP地址与long之间的转换

    IP地址转为long型: public static long ipToLong(String ip) {String[] ipArray = ip.split("\\.");Li ...

  5. Java中的类和对象

    文章目录 一.类和对象的初步认识 1.1 类和对象的基本概念 1.2 类和类的实例化 二.面向对象的封装性 2.1 封装的基本概念及用法 2.2 getter和setter方法 三.构造方法 3.1 ...

  6. java中的类和对象(重点)超详细

    java中的类和对象 1.类与对象的初步认知 2.类和对象的实例化 3.类的成员 3.1.字段,属性,成员变量 3.2.方法 3.3.static 关键字 3.4.小结 4.封装 4.1.privat ...

  7. 12月29日--Java中有关类与对象的学习记录

    1.12月29日第一课记录 Java中有关类与对象的学习记录 一.基本概念部分 1.类:具有相同.相似的属性.特征.行为方式以及功能的一类事物的总称 (举例:一类用户,如淘宝用户) 类是对象的模板 是 ...

  8. JAVA中的类和对象之this的详解

    系列文章目录 第一章 JAVA中的类和对象之this的详解 目录 前言 一.为什么要有this引用 二.this的三种用法 1.this.成员变量 2.this.成员方法 3.this()调用其它的构 ...

  9. 面向对象系列教材 (一)- Java中的类和对象

    面向对象系列教材 (一)- Java中的类和对象 本章节会引入面向对象的基本概念 (但是不会深入展开,仅仅是引入. 深入的学习会在后续的类和对象以及接口与继承 中展开) 相信你肯定玩过DOTA或者LO ...

最新文章

  1. 机器学习7—AdaBoost学习笔记
  2. 写个Fragment方便的抽象基类 BaseFragment
  3. 解决:which: no java in (/root/chengxu/maven/apache-maven-3.5.2/bin:/usr/local/sbin:/usr/local/bin:/usr
  4. OSG仿真案例(7)——osg自动驾驶
  5. 如何借助大数据进行宏观经济分析
  6. tomcat可以直接起jar吗_天津买房可以直接落户吗
  7. 手机信令数据怎么获得_手机信令数据辅助下的张江科学城职住分析及对策 | 上海城市规划...
  8. Java--继承(三)
  9. 68. 使用Apache的rewrite技术
  10. 安卓实现播放器app
  11. 这样做团建,还担心员工离职吗?
  12. Spring Container Extension
  13. 计算机显示器是输入,如果计算机显示器未显示视频输入怎么办
  14. 深度学习发展历程(2012年以前)
  15. Cookie、sessionStorage和localStorage
  16. Windows server 2019 - 磁盘加密(BitLocker)
  17. Stata实现DID(倍差法)全流程
  18. WSL Ubuntu guile命令报错Wrong __data_start/_end pair及guile-gi等相关编译错误的解决方法
  19. 开发小程序需要的一些安装工具
  20. 惠普HP Deskjet 1000喷墨打印机之体验 和 802s体验墨盒打印所需容量

热门文章

  1. MFC 蜂鸣声或播放音频
  2. REST面向资源架构 RESTful架构
  3. iOS 关于集成融云IM的一些常用方法
  4. MySQL- 用Navicat通过隧道连接到远程数据库
  5. Easyui主要组件用法
  6. Ralis: 连接数据库并查询
  7. 玩点创意编程,发现另一个世界
  8. php的yii简介,yii
  9. Jasypt 加密-整合SpringBoot
  10. Spring Cloud Alibaba Nacos Confifig是什么