java基础知识——泛型

  1. 泛型实现方式有两种,一种是类型膨胀,属于真实泛型(C#实现);另一种是类型擦除,称为伪泛型,java使用的是类型擦除,仅仅约束程序猿编码,编译后的class文件就替换回原生类型。
  2. 反射操作可以绕过泛型限制。

    package com.kevinlsui.base;
    
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test_fanxing {
    
    public static void main(String[] args) throws Exception {
        List<String> list = new ArrayList<String>();
        list.add("hahah");
        //list.add(1);//出错
    
        Class clazz = list.getClass();
        //List obj = (List) clazz.newInstance();
        Method m = clazz.getMethod("add",Object.class);
        m.invoke(list, 12);
    
        System.out.println(list);
    }
    

    }

  1. 泛型的弊端:在方法重载时,如果参数的区别仅仅是泛型,则无法重载,详细可见《Java虚拟机》相关章节。

    package com.kevinlsui.base;
    
    public class Test_fanxing2 {
    
        //方法重载
        public void ha(){
            System.out.println("method1...");
        }
        public void ha(String name){
            System.out.println("method2...");
        }
    
        //报错,原因是方法3,和方法4,参数区别仅仅是泛型,而泛型是类型擦除,编译完后就消失,这两个方法就成相同的了。
        /*public void ha(List<String> list){
            System.out.println("method3...");
        }*/
    
        /*public void ha(List<Integer> list){
            System.out.println("method4...");
        }*/
    
        //重载方法,加上返回值即可通过,但是方法重载仅仅与参数有关,与返回值无关的,此处为泛型的一个bug
        //《Java虚拟机》上的解决方案,在此并未成功,可能使用的jdk版本已经修复此bug
        /*public static Integer ha(List<String> list){
            System.out.println("method3...");
            return 1;
        }
        public static String ha(List<Integer> list){
            System.out.println("method4...");
            return "ok";
        }*/
    

    }

  1. 泛型的应用,在DbHelp类中,通过使用泛型,使得dbhelp得到通用。
文章目录
|