数据结构:泛型和反射

一.泛型

1.1什么是泛型

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

1.2泛型方法和使用

泛型除了用在类声明上,也可以单独来定义方法-一个类是普通类仍然也可以定义泛型方法在这里插入图片描述
在泛型类中定义了泛型方法在这里插入图片描述
在这里插入图片描述

1.3泛型接口

泛型还可以声明在接口,一旦一个接口使用泛型声明,子类在实现接口时就有两种选择
a.继续保留泛型在这里插入图片描述
b.子类明确当前的类型在这里插入图片描述
在这里插入图片描述

1.4通配符

在这里插入图片描述
1.?通配符,只能定义在方法中,表示可以接收所有类型的泛型类在这里插入图片描述
2.?extends类:设置泛型上限
在这里插入图片描述
在这里插入图片描述
3.<?super类>规定泛型下线-地板在这里插入图片描述
在这里插入图片描述
此时明确知道了子类,不管?是啥类型,都一定是String的父类,设置一个String对象,天然都is a 父类
a.由于此时明确的是下限,明确的是子类是谁,由于子类天然的是父类,可以设置值
b.super下限通配符,只能用在方法内部,不能在类中定义。

1.5类型擦除

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

二.反射

2.1什么是反射

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

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

2.2反射相关的类

在这里插入图片描述

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

由JVM产生,全局唯一在这里插入图片描述
在这里插入图片描述
2.通过反射调用构造方法
普通的get只能获取public权限的方法或者属性
getDeclared…()可以获取所有权限的方法或属性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
破坏封装产生对象在这里插入图片描述
3.通过反射调用普通方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值