数据结构:泛型和反射

文章目录

  • 一.泛型
    • 1.1什么是泛型
    • 1.2泛型方法和使用
    • 1.3泛型接口
    • 1.4通配符
    • 1.5类型擦除
  • 二.反射
    • 2.1什么是反射
    • 2.2反射相关的类

一.泛型

1.1什么是泛型

泛型:定义时没有明确参数的类型,使用时明确类型,看到=>泛型的定义,只有<>泛型操作符,不一定看到T就是泛型方法,只是使用了反省的普通方法
守门员,编译阶段检查了类型是否一致,避免了向下转型的强制类型转换的出错问题
泛型类:
T和E称为类型参数,占位符
class MyClass<单个大写字母,T,E,…>{
T val;
E val2;
}
MyClass cls = new MyClass<>();
泛型方法:
//只是使用了类型参数的普通方法
public T test(T t){
}
//泛型方法,返回值和参数都使用了泛型
public fun(T t){
}
泛型方法始终以自己定义的类型参数为准,和类中的泛型参数无关

1.2泛型方法和使用

泛型除了用在类声明上,也可以单独来定义方法-一个类是普通类仍然也可以定义泛型方法数据结构:泛型和反射_第1张图片
在泛型类中定义了泛型方法数据结构:泛型和反射_第2张图片
数据结构:泛型和反射_第3张图片

1.3泛型接口

泛型还可以声明在接口,一旦一个接口使用泛型声明,子类在实现接口时就有两种选择
a.继续保留泛型数据结构:泛型和反射_第4张图片
b.子类明确当前的类型数据结构:泛型和反射_第5张图片
数据结构:泛型和反射_第6张图片

1.4通配符

数据结构:泛型和反射_第7张图片
1.?通配符,只能定义在方法中,表示可以接收所有类型的泛型类数据结构:泛型和反射_第8张图片
2.?extends类:设置泛型上限
数据结构:泛型和反射_第9张图片
数据结构:泛型和反射_第10张图片
3.<?super类>规定泛型下线-地板数据结构:泛型和反射_第11张图片
数据结构:泛型和反射_第12张图片
此时明确知道了子类,不管?是啥类型,都一定是String的父类,设置一个String对象,天然都is a 父类
a.由于此时明确的是下限,明确的是子类是谁,由于子类天然的是父类,可以设置值
b.super下限通配符,只能用在方法内部,不能在类中定义。

1.5类型擦除

泛型只是编译阶段的语法塘
泛型类和普通类进入JVM之后,没有任何区别
javac->.java编译为.class之后,泛型就没了
类型擦除:泛型信息其实只存在与编译阶段,进入JVM后,会将所有和泛型相关的信息擦除掉。
若没有规定泛型上限,则所有泛型信息都擦除为Object类型
若规定泛型上限,则擦除为相应的泛型上限类型数据结构:泛型和反射_第13张图片
在这里插入图片描述
数据结构:泛型和反射_第14张图片

二.反射

2.1什么是反射

反射(一切框架的基础):在JVM运行时
对于JVM中任何一个类,都能动态的获取该类所有属性和方法。
对于JVM中任何一个对象,都能动态的调用该对象的属性和方法。
动态获取信息以及调用对象机制称为反射机制。

运行时类型RTTI
编译时类型
Person p = new Student();//p的编译时类型Person,运行时类型就是Student
运行时明确该引用到底是啥类型就可以通过反射机制。

2.2反射相关的类

数据结构:泛型和反射_第15张图片

1.无论要通过反射机制干啥事,首先第一步就是获取该类的class对象(由JVM产生,全局唯一)
a.调用class.forNam(类的全名称,包名.类名)
b.调用类名称.class属性Student.class
c.通过该类的任意对象的getClass方法()

由JVM产生,全局唯一数据结构:泛型和反射_第16张图片
数据结构:泛型和反射_第17张图片
2.通过反射调用构造方法
普通的get只能获取public权限的方法或者属性
getDeclared…()可以获取所有权限的方法或属性
数据结构:泛型和反射_第18张图片
数据结构:泛型和反射_第19张图片
数据结构:泛型和反射_第20张图片
破坏封装产生对象数据结构:泛型和反射_第21张图片
3.通过反射调用普通方法
数据结构:泛型和反射_第22张图片
在这里插入图片描述
数据结构:泛型和反射_第23张图片
数据结构:泛型和反射_第24张图片
数据结构:泛型和反射_第25张图片

你可能感兴趣的:(JAVA,数据结构及算法,数据结构)