Java泛型

为什么引入泛型?

泛型的本质是为了让数据类型参数化(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类泛型接口泛型方法

  • 泛型类:是在实例化类的时候指明泛型的具体类型;
  • 泛型方法:是在调用方法的时候指明泛型的具体类型。

泛型类

单泛型类

单泛型类指的是泛型类中仅包含一个泛型符号。

class Point<T>{         // 此处可以随便写标识符号,T是type的简称  
    private T var ;     // var的类型由T指定,即:由外部指定  
    public T getVar(){  // 返回值的类型由外部决定  
        return var ;
    }
    public void setVar(T var){  // 设置的类型也由外部决定  
        this.var = var ;
    }
}
public class GenericsDemo06{
    public static void main(String args[]){
        Point<String> p = new Point<String>() ;     // 里面的var类型为String类型  
        p.setVar("it") ;                            // 设置字符串  
        System.out.println(p.getVar().length()) ;   // 取得字符串的长度  
    }
}

多元泛型

多元泛型指的是类中包含多个泛型符号

class Notepad<K,V>{       // 此处指定了两个泛型类型  
    private K key ;     // 此变量的类型由外部决定  
    private V value ;   // 此变量的类型由外部决定  
    public K getKey(){
        return this.key ;
    }
    public V getValue(){
        return this.value ;
    }
    public void setKey(K key){
        this.key = key ;
    }
    public void setValue(V value){
        this.value = value ;
    }
}
public class GenericsDemo09{
    public static void main(String args[]){
        Notepad<String,Integer> t = null ;        // 定义两个泛型类型的对象  
        t = new Notepad<String,Integer>() ;       // 里面的key为String,value为Integer  
        t.setKey("汤姆") ;        // 设置第一个内容  
        t.setValue(20) ;            // 设置第二个内容  
        System.out.print("姓名;" + t.getKey()) ;      // 取得信息  
        System.out.print(",年龄;" + t.getValue()) ;       // 取得信息  

    }
}

泛型方法

泛型方法,是在调用方法的时候指明泛型的具体类型。
定义泛型方法的格式如下:

权限修饰符 <T> T 函数名(参数 ){
}


代码示例如下:

public class GenericsDemo09{
    public <T> T getObject(Class<T> c) throws InstantiationException, IllegalAccessException {
        T t = c.newInstance();
        return t;
    }
    public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        GenericsDemo09 genericsDemo09 = new GenericsDemo09();
        Object obj = genericsDemo09.getObject(Class.forName("GenericsDemo09"));
        System.out.println(obj);

    }
}

java泛型中<?>和有什么区别?

  • 在整个类中只有一处使用了泛型,使用时注意加了泛型了参数不能调用与参数类型有关的方法比如“+”,比如打印出任意参数化类型集合中的所有内容,就适合用通配符泛型<?>
SuperClass<?> sup = new SuperClass<String>("lisi");
  • 当一个类型变量用来表达两个参数之间或者参数与返回值之间的关系时,即统一各类型变量在方法签名的两处被使用,或者类型变量在方法体代码中也被使用而不仅仅在签名的时候使用,这是应该用自定义泛型
List<T> al=new ArrayList<T>();指定集合元素只能是T类型 

本文内容均为自己理解加上对网上资源的总结,如有错误,欢迎批评指正。参考了如下博客:

https://segmentfault.com/a/1190000023020690
https://pdai.tech/md/java/basic/java-basic-x-generic.html

posted @ 2023-11-18 14:57  技术小白求安排  阅读(29)  评论(0)    收藏  举报