当前位置:网站首页>何为擦除机制,泛型的上界?
何为擦除机制,泛型的上界?
2022-07-29 13:31:00 【陈亦康】
擦除机制
如下代码:
class Demo1 <T>{
private T[] array = (T[])new Object[6];
public void setArray(T str, int pos){
this.array[pos] = str;
}
public T getArray(int pos){
return this.array[pos];
}
}
public class Test{
public static void main(String[] args){
Demo1<String> demo1 = new Demo1<>();
demo1.setArray("China",0);
System.out.println(demo1.getArray(0));
}
}在终端通过javap -c 字节码文件 可以观察到如下结果:

所有的 T类型,在编译阶段全部被换成了Object类型(在运行期间没有泛型机制),这便是擦除机制
1.全部擦除成了Object,那为什么不能直接写成public Object[ ] array = new Object[6]?
假设存在那么一定会存在Object类型的数组,那么观察下面代码:
class Demo1 <T>{
private T[] array =(T[])new Object[6];
public void setArray(T i, int pos){
this.array[pos] = i;
}
public T[] getArray(){
return array;
}
}
public class Test{
public static void main(String[] args){
Demo1<Integer> demo1 = new Demo1<>();
demo1.setArray(100,0);
Integer[] integer = demo1.getArray();
}
}运行结果:

他会告诉你类型转化异常,Object类型数组不能被转化成Integer类型的数组;
原因可想而知,Object类型数组,里面可以放任意类型数据(例如:{ "china",15,15.6}),如果让Integer类型的数组去引用他,编译器为了安全考虑(不全是Integer类型)肯定会报错的。
正确改法如下:(告诉Object我会传入一个什么类型)
import java.lang.reflect.Array;
import java.util.Arrays;
class Demo1 <T>{
public T[] array;
public Demo1(Class<T> array, int size){
this.array = (T[]) Array.newInstance(array, size);
}
public void setArray(T i, int pos){
this.array[pos] = i;
}
public T[] getArray(){
return array;
}
}
public class Test{
public static void main(String[] args){
Demo1<Integer> demo1 = new Demo1<>(Integer.class,10);
Integer[] integer = demo1.getArray();
System.out.println(Arrays.toString(integer));
}
}泛型的上界
通俗讲,就是通过对传入的数据类型进行一定约束的一个边界(注意:泛型只有上界,没有下界,通配符即有上界又有下界)
如下代码:(定义边界为Number类型)
class Demo2<E extends Number>{
}
public class Test{
public static void main(String[] args){
Demo2<Integer> demo2 = new Demo2<>();
}
}此时,能传入的只能是Number及其子类。
例题:写一个泛型类,找出数组的最大值
class Demo2<T extends Comparable<T>>{//只要这个T实现了这个接口即可
public T findMax(T[] array){
T max = array[0];
int i = 0;
for(i = 0; i < array.length; i++){
if(array[i].compareTo(max) > 0){
max = array[i];
}
}
return max;
}
}
public class Test{
public static void main(String[] args){
Integer[] array = {1,5,9,6,3,5};
Demo2<Integer> demo2 = new Demo2<>();
int ret = demo2.findMax(array);
System.out.println("max = " + ret);
}
}边栏推荐
猜你喜欢
随机推荐
九种方式,教你读取 resources 目录下的文件路径
IJCAI 2022 outstanding papers published, China won two draft in 298 the first author
万字长文,揭秘华为数据治理体系!
在金融服务行业数字化转型中,低代码值得被关注
【10点公开课】:快手GPU/FPGA/ASIC异构平台的应用探索
The core principles of electronic games
frp-免费内网穿透
AI全流程开发难题破解之钥
验证二叉树的前序序列化[抽象前序遍历]
【论文阅读】Anomaly Detection in Video via Self-Supervised and Multi-Task Learning
Understand the yolov7 network structure
即时通讯移动端开发之网络连接优化
BGP联邦综合实验
浅谈防勒索病毒方案之主机加固
何享健“A拆A”又败一局,美的旗下美智光电终止创业板IPO
How to set the explosion rate of legendary humanoid?Humanoid increase tutorial
力扣 206.反转链表--递归解决
【JS高级】js之闭包对象_04
手摸手写一个互联网黑话生成器
The 10,000-character long article reveals the secrets of Huawei's data governance system!








