泛型描述:“泛型”的字面意思就是 广泛的类型。类、接口和方法代码可以同应用于非常广泛的类型,代码与它们可以操作的数据类型不再绑定在一起,同一套代码可以用于多种数据类型,这样,不仅可以服用代码,降低耦合,而且可以提高代码的可读性和安全性。
1.泛型的基本概念
下面是一个简单的泛型类
public class Pair<T>{
private T first;
private T second;
public Pair(T first,T second){
this.first = first;
this.second = second;
}
public T getFirst(){
return first;
}
public T getsecond(){
return second;
}
}
Pair就是一个普通的泛型类,与普通类的区别体现在:
(1)类型后面多了个<T>
(2)first和second的类型都是T
T是什么呢?T表示参数类型,泛型就是类型参数化,处理数据的类型不是固定的,而是可以作为参数传入,怎么用这个泛型类,并传递类型参数,看下面代码:
Pair<Integer> m = new Pair<Integer>(2,9);
Integer f = m.getFirst();
Integer s = m.getSecond();
Pair<Integer> 中的Integer就是传递实际的类型参数,Pair类的代码和它处理的数据类型不是绑定的,具体参数类型是可以
变化的。上面是Integer,也可以是String,比如,看下面代码:
Pair<String> m = new Pair<String>("学习","泛型");
String f = m.getFirst();
String s = m.getSecond();
类型参数可以是多个,以逗号隔开,可以是不同类型的参数,来看改进后的Pair类,代码如下:
public class Pair<T,V>{
private T first;
private v second;
public Pair(T first,V second){
this.first = first;
this.second = second;
}
public T getFirst(){
return first;
}
public V getsecond(){
return second;
}
}
可以这样使用
Pair<String,Integer> m = new Pair<String,Integer>("多个类型参数",2)
<String,Integer> 出现在申明变量,又出现在new后面,比较繁琐,从Java 7开始,可以省略后面的类型参数,代码如下:
Pair<String,Integer> m = new Pair("省略new后边的类型参数的使用方法",2);
2.泛型的基本原理
package fanxin;
/**
* 2.=======================泛型的基本原理==============================
* 泛型类型参数到底是什么呢?,为什么一定要定义类型参数呢,定义普通类直接,直接使用Object
* 不就行了吗?比如,Pair3类可以写为
*
* 我们知道,java有java编译器和java虚拟机,编译器将java源代码转换为.class文件,虚拟机加载并运行.class文件
* 对于泛型类,java编译器会将泛型类代码转换成普通非泛型类代码,就如下面的代码,将类型参数T擦除,替换为Object
* 插入强制的类型转换,java虚拟机实际运行的时候,它是不知道泛型这回事的,只知道普通的类及代码。
*
*
* 在强调一下,java泛型是通过擦除实现的,类定义中的类型参数T会被替换为Object,在程序运行过程中,不知道泛型的实际参数类型
* Pair<String> 运行中只知道Pair 而不知道参数类型String
*
* java为什么要这样设计呢?泛型是JAVA 5以后才支持的,这样设计师为了兼容性而不得已的一个选择
*
* java泛型的内部原理如下:
*/
public class FanxinYuanli {
public static void main(String[] args) {
Pair4 p = new Pair4("泛型原理",1);
String f = (String) p.getFirst();
Integer s = (Integer) p.getSecond();
System.out.println(f+"---"+s);
}
}
class Pair4{
private Object first;
private Object second;
public Pair4(Object first,Object second){
this.first = first;
this.second = second;
}
public Object getFirst() {
return first;
}
public Object getSecond() {
return second;
}
}