java泛型总结

1 说明

1)Generics是对java语言类型系统的一种扩展,以支持创建可以按类型进行参数化的类或者方法。

2)泛型的优点:

  1. 类型安全(使用泛型时,编译器可以捕获附加类型信息,从而类型错误在编译时被捕获而不是运行时来进行检测)

  2. 消除强制类型转换,减少了代码出错的可能性,并且使代码更加可读

2 泛型类实例

不使用泛型,此种情况需要类型转换

package com.wish.generic;

public class Person {
    private Object x;
    private Object y;
    private Object z;
    public Object getX(){
        return x;
    }
    public void setX(Object x){
        this.x =x;
    }
    public Object getY(){
        return y;
    }
    public void setY(Object y){
        this.y =y;
    }
    public Object getZ(){
        return z;
    }
    public void setZ(Object z){
        this.z =z;
    }
    public static void main(String[] args) {
        Person s = new Person();
        s.setY(20);
        int x = (Integer)s.getX();
        System.out.println(x);
    }

}

使用泛型:

package com.wish.generic;

public class PersonG<T1,T2>{
    private T1 x;
    private T2 y;
    public T1 getX(){
        return x;
    }
    public void setX(T1 x){
        this.x = x;
    }
    public T2 getY(){
        return y;
    }
    public void setY(T2 y){
        this.y = y;
    }
    public static void main(String[] args){
        PersonG<Integer,String> pg = new PersonG<Integer,String>(); //实例化时即可定义类型
        pg.setX(20);
        pg.setY("this is a string");
        System.out.println(pg.getX());
        System.out.println(pg.getY());
    }
}

3.泛型方法

说明:

  1)泛型的声明必须在方法的修饰符(public,static,final,abstract等)之后,返回值声明之前

  2)和泛型类一样,可以声明多个泛型,用逗号隔开

泛型方法类:

package com.wish.generic;
public class GenFunction {
    public static<T> void display(T t){
        System.out.println(t.getClass());
    }
}

测试类:

package com.wish.generic;

public class Driver {
    public static void main(String[] args) {
        GenFunction.display(11);
        GenFunction.display(11f);
        GenFunction.display("abcd");
    }
}

输出:

class java.lang.Integer
class java.lang.Float
class java.lang.String

关于类型擦除的说明:类型擦除是指运行期不关注泛型的类型信息,但是t.getClass返回的是实例的类型类型而不是泛型的信息

4.注意事项

1)Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉(类型擦除)

2)泛型类并没有自己独有的Class类对象。比如并不存在List<String>.class或是List<Integer>.class,而只有List.class。

原文地址:https://www.cnblogs.com/wishyouhappy/p/3665569.html