浅析Java中的泛型

1、泛型产生的原因:
首先,在这里要说明的是在JDK1.5+后才添加的。在这之前,每当我们想在容器里里添加内容时,当手动添加的类型出错(比如想输入String但是却不小心输了int),就会报错。那么泛型在此处就可以规范我们输入的数据类型。

HashSet<String> hs = new HashSet<String>();

当我们像上面的示例一样使用泛型时,如果输入的数据类型和泛型规定的不一样,在编译期就会报错。
2、泛型概念:
泛型实现了了参数化类型的概念,使得代码可以应用于多种类型。
那么什么是参数化类型呢?

Stack<T>

当我们向上面一样定义一个栈(容器)时,用一个没有特殊意义的字母T,表示了Stack中存储的数据类型。
这样做的好处就是,当我们在实例化这个类的时候,可以直接在< >中定义数据类型。(<>此处只能定义数据类型的包装类
使用泛型的优点:
(1)类型安全:使用泛型之后,可指定输入的类型,比如只能输入String类型的值,输入其他的就会报错,这在代码编写时,为我们提供了极大的方便。
(2)消除强制类型转换:也就是说我们不需要进行类型转化,直接存储、直接输出。
(3)只在编译时期有效:也就是说在运行期的泛型是无效的。这避免了jvm花费时间在运行时做额外的操作。
(1)(2)还是比较好理解的,(3)这里我们用反射机制来验证一下第三点

public class Demo {
    public static void main(String[] args) throws Exception {
        //第一个list1我们创建一个可以输入任何类型
         ArrayList list1=new ArrayList();
        //第二个list2我们创建了一个泛型:只能输入int类型
        ArrayList<Interger> list2=new ArrayList<Interger>();
        //反射,获取Class
        Class c1=list1.getClass();
        Class c2=list2.getClass();
        //在运行时,他们的关系
        System.out.print(c1==c2);//true
    }
}

由上面的代码示例可以看到,当我们在运行时,泛型失去了作用。一个定义了泛型的list和一个没有定义泛型的list比较是相等的。

注:
1、不能对泛型类使用instanceof。因为泛型类只在编译期有效,在运行时期不区分是什么类型。否则会出现如下错误。

Cannot perform instanceof check against parameterized type Box<Integer>. 
Use the form Box<?> instead since further 
generic type information will be erased at runtime

2、继承泛型接口的时候就需要指定具体是什么类型
3、泛型中的方法也需要对相应的泛型参数赋予具体的类型。
4、在静态方法中使用泛型参数的时候,需要我们把静态方法定义为泛型方法

泛型的类型擦除机制:
上面说过,泛型只在编译期有效,在运行期虚拟机是分辨不出来的,而且我们还用一个反射代码来验证了。那么,从编译期能够识别泛型,再到运行期不能识别泛型肯定需要一个过程,在这个过程中编译器肯定要对泛型进行一个处理,才能到运行期。这个处理就是类型擦除。

public class demo{
public void func1(List<Interger>  list){  }
public void func1(List<String>  list){  }
}

当我们定义了上面这段代码时,在编译时期就会不通过报错。因为泛型的类型擦除机制在编译期就已经进行,这里相当于上面的两个func1方法并不是方法的重载。那么这里就又要提到了泛型类型擦除的上下界。擦出上界(没有设置的情况下默认擦除到Object)用extends关键字。擦出下界用super关键字。我们一般用上界比较多。
泛型其实就是一个语法糖,语法糖就是一个方便程序员的功能,对语言没有任何影响。真正想要掌握泛型机制的话,还需要自己再在代码上下下功夫。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值