天天看点

Java泛型详解1、Java泛型背景2 、泛型是什么3、 类泛型的使用4、泛型接口的使用5、泛型方法的使用

1、Java泛型背景

  Java泛型是JDK1.5时引入的新特性之一,提供了编译时期的类型安全检测机制,由于历史原因,Java泛型的实现方式有点特殊,通过类型擦除等方法实现,其保证了JDK的兼容性。

2 、泛型是什么

  Java泛型又称为参数化类型,可以将原来形参的类型当做参数进行传递,Java中主要使用方式有类泛型,接口泛型,方法泛型。

集合类演示

public static void main(String[] arg) {
    List list1=new ArrayList(); 
    list1.add(new Student());
    list1.add(new Teacher());
  
    List<Student>list2=new ArrayList<>();
    list2.add(new Student());
    list2.add(new Teacher()); // error
}      
class Student{}
class Teacher{}      

  在集合类中,如果不使用泛型,将不会报错(在add的时候两者都被转换成了Object类型),这样将导致在取出数据强转的时候有可能出现转换错误。如果使用泛型,那么在编译时就会出错,不会到转换时出错。

3、 类泛型的使用

 顾名思义就是泛型作用在类上,如下示例所示:
class Person<T>{
    private T name;

    public T getName() {
        return name;
    }
    public void setName(T name) {
        this.name = name;
    }
}
      
class Person<T,U> {

    private T name;

    private U age;

    public T getName() {
        return name;
    }
    public void setName(T name) {
        this.name = name;
    }
    public U getAge() {
        return age;
    }
    public void setAge(U age) {
        this.age = age;
    }
}      

  如上所示, 通过在声明类时加上具体类型,就可以使用,也可以同时使用多个泛型参数

4、泛型接口的使用

  如下所示:

class Student<U> implements Person<U>{
    @Override
    public U SayHello() {
        return null;
    }
}

interface Person<T> {
   T SayHello();
}      

  注意到,具体泛型名称由T变成U,这是不影响的,泛型名称可以随便用,可以使用K,V,M,N等等,使用T只是大家的规范而已 

5、泛型方法的使用

class Person<T>{

    public void sayHello(T s){ // 此T依据类T
        System.out.println(s);
    }

    public <T> void sayHello2(T s){ //此T依据方法T
        System.out.println(s);
    }

    public <U> void sayHello3(U s){ //此U依据类U
        System.out.println(s);
    }
}      

  上面方法中依据的泛型是不一样的,Hello2的命名不好,很容易造成混淆,Hello2与Hello3就是泛型方法的使用,根据具体的泛型方法的使用,根据传入的值的类型,作为泛型

后续待更新