java中的泛型
2016-01-04 22:44
423 查看
一、何为泛型
泛型,即为广泛的类型。设计了一个泛型类,我们可以往里面填充广泛的类型。在创建的时候只要往里面填充特定的类型,就要得到自己想要的对象。泛型类似于一个瓶子,我们要喝水的往水瓶里面装水就可以得到一瓶矿泉水。我们想喝可乐的时候往瓶子里面转入可乐,便可以得到一瓶可乐。
二、泛型的语法
class Test<T>{
private T parameter;
public Test(){
this.parameter = parameter;
}
public T getParameter(){
return parameter;
}
public void setParameter(T parameter){
this.parameter = parameter;
}
}
这样子便可以在java中定义一个泛型类,使用class Test<Double> = new Test<Double>()便可以创建一个泛型类对象。
class GenericMethodClass{
public static <T> T genericMethod(T a){
}
}
使用这样的语法,便可以创建一个java泛型方法。Double b = 2.0;GenericMethodClass.<Double>genericMethod(b)便可以调用这个方法,也可以直接GenericMethodClass.genericMethod(b)进行,java编译器会自动根据b的类型进行推断调用何种方法。这里为什么要使用Double引用类型而不使用基本类型double呢?就是因为泛型类型参数只能是引用类型,而不能是基本基本类型。
三、泛型在虚拟机中的实现
java虚拟机里面是没有泛型类这个概念的,所有的泛型在虚拟机中都会被用原生类型来代替,这就是所谓的java虚拟机的类型擦除
class Test<T>{
private T parameter;
public T getParameter(){
return parameter;
}
}
这样的一个泛型类在运行的时候,在虚拟机中会被类型擦除成下面这种形式
class Test{
private Object parameter;
public Object getParameter(){
return parameter;
}
}
如果一个泛型的类型T有限定,则会使用限定类型去替换
Class Test<T extends Comparable>{
private T parameter;
public T getParameter(){
return parameter;
}
}
在虚拟机中则会被替换成
Class Test{
private Comparableparameter;
public Comparable getParameter(){
return parameter;
}
}
因为在java虚拟机中存在类型擦除,所以在执行泛型函数的时候,获取泛型类型的变量是自动插入强制类型转换
Test<Double> test = new Test<Double>();
Double a = test.getParameter();
test.getParameter拿到的变量是一个Object类型的,因为变量a是Double类型的,所以在执行这个函数的时候,java虚拟机会自动加入强制类型转换。
四、java泛型的约束
1.泛型的类型参数只能是引用类型的,而不能是基本类型的。
2.不能创建参数化的类型数组
3.因为存在类型擦除,所以在运行时只能进行基本类型的查询判断
泛型,即为广泛的类型。设计了一个泛型类,我们可以往里面填充广泛的类型。在创建的时候只要往里面填充特定的类型,就要得到自己想要的对象。泛型类似于一个瓶子,我们要喝水的往水瓶里面装水就可以得到一瓶矿泉水。我们想喝可乐的时候往瓶子里面转入可乐,便可以得到一瓶可乐。
二、泛型的语法
class Test<T>{
private T parameter;
public Test(){
this.parameter = parameter;
}
public T getParameter(){
return parameter;
}
public void setParameter(T parameter){
this.parameter = parameter;
}
}
这样子便可以在java中定义一个泛型类,使用class Test<Double> = new Test<Double>()便可以创建一个泛型类对象。
class GenericMethodClass{
public static <T> T genericMethod(T a){
}
}
使用这样的语法,便可以创建一个java泛型方法。Double b = 2.0;GenericMethodClass.<Double>genericMethod(b)便可以调用这个方法,也可以直接GenericMethodClass.genericMethod(b)进行,java编译器会自动根据b的类型进行推断调用何种方法。这里为什么要使用Double引用类型而不使用基本类型double呢?就是因为泛型类型参数只能是引用类型,而不能是基本基本类型。
三、泛型在虚拟机中的实现
java虚拟机里面是没有泛型类这个概念的,所有的泛型在虚拟机中都会被用原生类型来代替,这就是所谓的java虚拟机的类型擦除
class Test<T>{
private T parameter;
public T getParameter(){
return parameter;
}
}
这样的一个泛型类在运行的时候,在虚拟机中会被类型擦除成下面这种形式
class Test{
private Object parameter;
public Object getParameter(){
return parameter;
}
}
如果一个泛型的类型T有限定,则会使用限定类型去替换
Class Test<T extends Comparable>{
private T parameter;
public T getParameter(){
return parameter;
}
}
在虚拟机中则会被替换成
Class Test{
private Comparableparameter;
public Comparable getParameter(){
return parameter;
}
}
因为在java虚拟机中存在类型擦除,所以在执行泛型函数的时候,获取泛型类型的变量是自动插入强制类型转换
Test<Double> test = new Test<Double>();
Double a = test.getParameter();
test.getParameter拿到的变量是一个Object类型的,因为变量a是Double类型的,所以在执行这个函数的时候,java虚拟机会自动加入强制类型转换。
四、java泛型的约束
1.泛型的类型参数只能是引用类型的,而不能是基本类型的。
2.不能创建参数化的类型数组
3.因为存在类型擦除,所以在运行时只能进行基本类型的查询判断
相关文章推荐
- 跟我学习dubbo-简介(1)
- 从头认识java-15.7 Map(7)-TreeMap与LinkedHashMap
- 深入java虚拟机(一)
- Unable to load configuration. - include file...+java/net/PlainSocketImpl.java:177:-1
- 自学java hibernate基本配置
- java/jsp-向mysql写数据时出现了中文乱码
- 如何手动安装eclipse插件
- (转载)java程序的几种类型
- java读取/写入属性文件
- Java 泛型具体解释
- Arrays.asList() 返回的list不能add,remove以及慎用java.util.Collections.copy()方法
- 设计模式学习笔记--装饰者模式(Decorator Pattern)
- Java中父类和子类关于构造方法和私有属性的几个问题
- Java正则表达式-语法与示例
- java socket学习笔记
- Java知识点汇总
- Java SE 第十讲---面向对象特征之封装2
- JAVA语法之小结
- Spring中 <tx:advice/> 标签
- 使用Spring为Hibernate配置声明式事物