当前位置:网站首页>泛型与反射,看这篇就够了
泛型与反射,看这篇就够了
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得到的方法,调用方法。
边栏推荐
- Learning records of data analysis (II) -- simple use of response surface method and design expert
- [leetcode] reverse string [344]
- go 多线程数据搜索
- pytorch训练CPU占用持续增长(bug)
- [Solved] Splunk: Cannot get username when all users are selected“
- 世界环境日 | 周大福用心服务推动减碳环保
- 中国信通院、清华大学、腾讯安全,云原生安全产学研用强强联合!
- 數據分析學習記錄--用EXCEL完成簡單的單因素方差分析
- 'when to use const char * and when to use const char []' - when to use const char * and when to use const char []
- [Luogu p1541] tortoise chess [DP]
猜你喜欢
UE4 game architecture learning notes
WebRTC音视频采集和播放示例及MediaStream媒体流解析
Boot actuator - Prometheus use
Higher order operation of bits
海思3559万能平台搭建:在截获的YUV图像上旋转操作
Dahua cloud native load balancing article - the passenger flow of small restaurants has increased
[leetcode] reverse the word III in the string [557]
Go语言sqlx库操作SQLite3数据库增删改查
odoo13搭建医院HRP环境(详细步骤)
图形视图框架
随机推荐
杰理之样机无触摸,拆机之后重新安装变正常【篇】
[LeetCode] 多数元素【169】
解决Chrome浏览器和Edeg浏览器主页被篡改的方法
U++ learning notes - relaxation
杰理之、产线装配环节【篇】
pytorch训练CPU占用持续增长(bug)
The kth largest element in the [leetcode] array [215]
E-commerce system microservice architecture
牛客网:最大子矩阵
百度智能云-创建人脸识别应用
[leetcode] number of palindromes [9]
P1007 独木桥
原生js添加样式的方法
大一学习分享
UE4 UI adaptive screen
Graphic view frame
DTM distributed transaction manager PHP collaboration client V0.1 beta release!!!
Performance optimization - rigorous mode
[chestnut sugar GIS] ArcMap - how to batch modify the font, color, size, etc. of annotation elements
钟薛高回应产品1小时不化:含固体成分 融化不能变成水