• 何为擦除机制,泛型的上界?


    擦除机制

    如下代码:

    1. class Demo1 {
    2. private T[] array = (T[])new Object[6];
    3. public void setArray(T str, int pos){
    4. this.array[pos] = str;
    5. }
    6. public T getArray(int pos){
    7. return this.array[pos];
    8. }
    9. }
    10. public class Test{
    11. public static void main(String[] args){
    12. Demo1 demo1 = new Demo1<>();
    13. demo1.setArray("China",0);
    14. System.out.println(demo1.getArray(0));
    15. }
    16. }

    在终端通过javap -c 字节码文件 可以观察到如下结果:

    所有的 T类型,在编译阶段全部被换成了Object类型(在运行期间没有泛型机制),这便是擦除机制

    1.全部擦除成了Object,那为什么不能直接写成public Object[ ] array = new Object[6]?

            假设存在那么一定会存在Object类型的数组,那么观察下面代码:

    1. class Demo1 {
    2. private T[] array =(T[])new Object[6];
    3. public void setArray(T i, int pos){
    4. this.array[pos] = i;
    5. }
    6. public T[] getArray(){
    7. return array;
    8. }
    9. }
    10. public class Test{
    11. public static void main(String[] args){
    12. Demo1 demo1 = new Demo1<>();
    13. demo1.setArray(100,0);
    14. Integer[] integer = demo1.getArray();
    15. }
    16. }

    运行结果:

            他会告诉你类型转化异常,Object类型数组不能被转化成Integer类型的数组;

            原因可想而知,Object类型数组,里面可以放任意类型数据(例如:{ "china",15,15.6}),如果让Integer类型的数组去引用他,编译器为了安全考虑(不全是Integer类型)肯定会报错的。

    正确改法如下:(告诉Object我会传入一个什么类型)

    1. import java.lang.reflect.Array;
    2. import java.util.Arrays;
    3. class Demo1 {
    4. public T[] array;
    5. public Demo1(Class array, int size){
    6. this.array = (T[]) Array.newInstance(array, size);
    7. }
    8. public void setArray(T i, int pos){
    9. this.array[pos] = i;
    10. }
    11. public T[] getArray(){
    12. return array;
    13. }
    14. }
    15. public class Test{
    16. public static void main(String[] args){
    17. Demo1 demo1 = new Demo1<>(Integer.class,10);
    18. Integer[] integer = demo1.getArray();
    19. System.out.println(Arrays.toString(integer));
    20. }
    21. }

    泛型的上界

    通俗讲,就是通过对传入的数据类型进行一定约束的一个边界(注意:泛型只有上界,没有下界,通配符即有上界又有下界)

    如下代码:(定义边界为Number类型)

    1. class Demo2extends Number>{
    2. }
    3. public class Test{
    4. public static void main(String[] args){
    5. Demo2 demo2 = new Demo2<>();
    6. }
    7. }

    此时,能传入的只能是Number及其子类。

    例题:写一个泛型类,找出数组的最大值

    1. class Demo2extends Comparable>{//只要这个T实现了这个接口即可
    2. public T findMax(T[] array){
    3. T max = array[0];
    4. int i = 0;
    5. for(i = 0; i < array.length; i++){
    6. if(array[i].compareTo(max) > 0){
    7. max = array[i];
    8. }
    9. }
    10. return max;
    11. }
    12. }
    13. public class Test{
    14. public static void main(String[] args){
    15. Integer[] array = {1,5,9,6,3,5};
    16. Demo2 demo2 = new Demo2<>();
    17. int ret = demo2.findMax(array);
    18. System.out.println("max = " + ret);
    19. }
    20. }

  • 相关阅读:
    结构体内存对齐详解
    Vue3学习系列之《列表渲染》
    设计模式:代理模式
    [C语言数据结构]队列
    数据库设计规范
    flink学习知识点小结
    MVC netbeans数据库操作注意事项
    关于javaScript的学习总结
    2023年中国反射膜产量及市场规模分析:随着太阳能产业快速发展,规模持续扩大[图]
    Zabbix邮箱报警
  • 原文地址:https://blog.csdn.net/CYK_byte/article/details/126029691