JAVA 泛型

1. 概述

泛型,即“参数化类型”。
在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型
泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

  通俗理解:为编译器检查指定输入类型提供约束条件。

2.DEMO

List list=new ArrayList();
list.add(1).

Object obj=list.get(0);
int objInt=(int) obj;

在泛型出现之前,集合内的数据类型编译器一致认为存放的类型是Object。即任何类型。在取出时 丢失了原有的数据类型。

取出使用时只能通过类型向下强制转换来实现,如果这一过程(存入与取出)在同一个代码块内实现。那么类型转换是可控的,

如果这一个过程是一方法的形式对外提供,那么这一过程是危险的、而且语法也显得非常冗余。例如此时:

list.add("HELLO WORD");
int sum=0
for(int i=0;i

那么此时该程序即会抛出java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer异常

那么此时对入参类型如何约束呢?

List list=new ArrayList();
//JDK 1.5 引入该特性  
//JDK1.7 引入类型推断 可使用简化写发:List list=new ArrayList<>();
list.add(1)//自动装箱
//此处编译器将错误提示
list.add("hellow");

int myInt = list.get(0);//自动拆箱
System.out.println(myInt );
Object myObj = list.get(0);//向上转换
System.out.println(myObj );
Integer myInteger = list.get(0);
System.out.println(myInteger );

当给定泛型时,若入参不符合要求则 编译器会给出错误警告。

3.泛型擦除

List strList=new ArrayList<>();

List intList=new ArrayList<>();

boolean b= strList.equals(intList);

System.out.printLn(b);

此时运行结果将是:true

上述例子可知:泛型只在编译前有效。在编译后泛型类型将被擦除。即:运行时并不能获取泛型信息。

4.泛型的使用

泛型类

class Test{//此处T为泛型符号 可以使用任意标识符指定泛型类型。提供类中成员变量与方法使用。

    private T key;//成员变量

    public Test(T key){//有参构造方法
        this.key=key;
    }

    public T getKey(){
        return key;
    }

    public void setKey(T key){
        this.key=key;
    }
    
}

//泛型类的实例化
Test test1= new Test<>(“abcd”);//编译通过
Test test2= new Test<>(1234);//编译通过

//泛型的类型参数只能是类类型(包括自定义类),不能是简单类型
Test test3= new Test<>(1234);//编译错误

//传入的参数与定义的参数需相符
Test test4= new Test<>(“abcd”);//编译错误

//参数类型不传入时,在泛型类中使用泛型的方法或成员变量定义的类型可以为任何的类型。
Test test5= new Test(1234);
Test test6= new Test(“abcd”);

//不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错
boolean = test1 instanceof Test;//编译错误

 

你可能感兴趣的:(java)