泛型的概念和原理

泛型描述:“泛型”的字面意思就是 广泛的类型。类、接口和方法代码可以同应用于非常广泛的类型,代码与它们可以操作的数据类型不再绑定在一起,同一套代码可以用于多种数据类型,这样,不仅可以服用代码,降低耦合,而且可以提高代码的可读性和安全性。

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;
	}
}

猜你喜欢

转载自blog.csdn.net/QQ1321078656/article/details/81206515