当前位置:网站首页>泛型与反射,看这篇就够了
泛型与反射,看这篇就够了
2022-07-02 22:09:00 【小趴菜学java】
目录
泛型:编译阶段检查程序是否存在错误的手段。
*泛型的定义
所谓泛型就是在类定义时不明确类型,在使用时明确类型
泛型:“<>”使用钻石操作符,<类>

*泛型类的定义:
package 泛型;
public class Point<T> {
//T类型参数
//此时xy的类型不确定,但保证了xy的类型一致性,xy的类型在产生对象时确定
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
*使用泛型类:
将泛型参数定义为String类型,将T x 转换成 String x,在给x赋整形值时就会报错。

多个泛型的使用:使用不同的大写字母来指定不同的类型。


*使用泛型的好处:
1,编译阶段检查类型是否一致,避免向下转型的强制类型转换的出错问题。
2,代码利于重用。
泛型的限制和规则
- 泛型的类型参数只能是引用类型,不能使用值类型。
- 泛型的类型参数可以有多个。
- 泛型类不是真正存在的类,不能使用instanceof运算符。
- 泛型类的类型参数不能用在静态申明。
- 如果定义了泛型,不指定具体类型,泛型默认指定为Ojbect类型。
- 泛型使用?作为类型通配符,表示未知类型,可以匹配任何类型。因为是未知,所以无法添加元素。
- 类型通配符上限:<? extends T>,?代表是T类型本身或者是T的子类型。常用于泛型方法,避免类型转换。
- 类型通配符下限。<? super T>,?代表T类型本身或者是T的父类型。
- 除了通配符可以实现限制,类、接口和方法中定义的泛型参数也能限制上限和下限。
**泛型方法:
1,使用泛型参数的普通方法:
public T fun(T t){
return t;
}2,返回值和参数都使用泛型的泛型方法
public <T> T Point(T t){
return t;
}
如果一个类是泛型类,泛型方法的类型参数与类的泛型参数无关。只与自己方法定义的泛型参数有关。
一个类是普通类,任然了可以定义泛型方法。但是定义的泛型方法,不能是被static修饰的 ,因为使用static修饰的类方法,无法给泛型传递泛型参数。
泛型类的泛型方法只能实例的。泛型方法在定义泛型时,使用不同的大写字母,避免产生歧义。

使用泛型参数的方法,不能被定义为静态的

泛型接口:
泛型接口,使用<>钻石操作符定义的接口,在实现接口时,可以继续保留泛型,也可以在实现类中


通配符:
三种通配符均可以设置在类和方法中。
一,?



二,?super Number,设置泛型的下限



三,? extents Number,设置泛型上限
表示最顶层的类型只能是Number和Number类的子类。



**类型擦除
泛型:语法糖
类型擦除:泛型信息其实只在编译阶段,进入JVM后,会将所有和泛型相关的信息擦除掉。
若没有规定泛型上限,则所有的泛型信息都会被擦除为Object类型,
若规定了泛型上限,则擦除为相应的泛型上限类型。
泛型类和普通类进入JVM之后,没有任何区别
经过javac编译以后,生成*.class 文件,泛型就会消失。


反射:动态获取信息及调用对象的机制称为反射机制。
一切框架的基础
在JVM运行时,
对于JVM中的任何一个类,都能动态获取该类的所有属性和方法。
对于JVM中的任何一个对象,都可以动态获取该对象的属性和方法。
反射的类型:
运行时类型:RTTI
编译时类型:
Person p = new Student();//编译时类型为Person,运行时类型为Student;
运行时类型的获取可以通过反射获取。

1,获取该类的class对象(有JVM产生,全局唯一)
a,调用Class.forName(包名.类名)
b,调用类名.class获取
c,通过对象.getClass()获取。
2,通过反射获取构造方法。
![]()
get只能获取public修饰的属性和方法。
getDeclared...()的方法获取全部的属性和方法。




破坏封装性:

![]()
使用class关键字,包括数组,接口编译后产生的class文件就唯一对应一个Class对象,这个对象有JVM产生,使用这个对象就可以获取该类的所有信息。
![]()




![]()

通过Method得到的方法,调用方法。



边栏推荐
- [leetcode] there are duplicate elements [217]
- 牛客网:龙与地下城游戏
- [NPUCTF2020]ezlogin xPATH注入
- How should programmers write logs
- 百度智能云-创建人脸识别应用
- Hanging mirror security won four global infosec awards on rsac2022
- 海思3559万能平台搭建:在截获的YUV图像上画框
- Go语言sqlx库操作SQLite3数据库增删改查
- Solve the error of changing the selected file when uploading excel file. Net:: err_ UPLOAD_ FILE_ CHANGED
- DTM distributed transaction manager PHP collaboration client V0.1 beta release!!!
猜你喜欢
随机推荐
[error record] the flutter reports an error (could not read script 'xxx\flutter\u tools\gradle\app\u plugin\u loader.gradle')
创新实力再获认可!腾讯安全MSS获2022年度云原生安全守护先锋
U++ learning notes - relaxation
Golang interview finishing three resumes how to write
U++ learning note pile
Jerry's modification does not require long press the boot function [chapter]
数组进阶提高
Jatpack------LiveData
[LeetCode] 存在重复元素【217】
NC50965 Largest Rectangle in a Histogram
Qt QSplitter拆分器
Xiaopeng P7 had an accident and the airbag did not pop up. Is this normal?
Golang's learning route
[autosar-dcm] - 4.3-how UDS $22 and $2e services read and write NVM data
杰理之样机无触摸,拆机之后重新安装变正常【篇】
`Usage of ${}`
大话云原生之负载均衡篇-小饭馆客流量变大了
The threshold value of fusing proportion cannot be changed with sentinel, and setting the slow call proportion has no effect
Notes on key vocabulary in the English original of the biography of jobs (10) [chapter eight]
地方经销商玩转社区团购模式,百万运营分享
![[LeetCode] 数组中的第K个最大元素【215】](/img/72/d3e46a820796a48b458cd2d0a18f8f.png)






![Gas station [problem analysis - > problem conversion - > greed]](/img/15/5313f900abedb46ce82d8ab81af1d7.png)
