码迷,mamicode.com
首页 > 编程语言 > 详细

java泛型

时间:2015-12-07 17:54:04      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

java泛型作用主要分为泛型类泛型接口,泛型方法。

看一个例子:

package collection;

public 	class Gen<T> {
		private T ob;
		public Gen(T ob) {
			this.ob = ob;
		}
		public void setOb(T ob) {
			this.ob = ob;
		}
		public T getOb() {
			return ob;
		}
		public void showType() {
			System.out.println("T的类型是:" + ob.getClass().getName());
		}
	}

建一个测试类

package collection;

public class GenTest {
	public static void main(String[] args) {
		Gen<Integer> intob=new Gen<Integer>(88);
		intob.showType();
		Gen<String> strob=new Gen<String>("ccccccccc");
		strob.showType();
		System.out.println(intob.getClass());
		System.out.println(strob.getClass());
		System.out.println(intob.getClass()==strob.getClass());
	}

}

测试结果

T的类型是:java.lang.String
class collection.Gen
class collection.Gen
true

 

可以看到什么是泛型,即参数化类型,如果不用泛型的话就的直接进行类型转换。在使用泛型类时,虽然传入了不同的泛型实参,但并没有真正意义上生成不同的类型,传入不同泛型实参的泛型类在内存上只有一个,即还是原来的最基本的类型(本实例中为Gen),当然,在逻辑上我们可以理解成多个不同的泛型类型。

究其原因,在于Java中的泛型这一概念提出的目的,导致其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。

对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。

参见的泛型参数主要是T、E、K、V

T一般是类中,E一般用在接口中,K、V主要用在Map里面

还有类型通配符?

List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
System.out.println(lu.get(0));

为什么该代码能工作呢?对于 lu,编译器一点都不知道 List 的类型参数的值。但是编译器比较聪明,它可以做一些类型推理。在本例中,它推断未知的类型参数必须扩展 Object。

另一方面

List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(42));
List<?> lu = li;
lu.add(new Integer(43)); // error

 在本例中,对于 lu,编译器不能对 List 的类型参数作出足够严密的推理,以确定将 Integer 传递给 List.add() 是类型安全的。所以编译器将不允许您这么做。

 

看一个例子

List myIntList=new LinkedList(); //1  
myIntList.add(newInteger(0)); //2  
Integer x=(Integer)myIntList.iterator().next(); //3  

 这里需要进行类型转换,下面这个使用泛型,就不需要转换

List<Integer> myIntList=newLinkedList<Integer>(); //1’  
myIntList.add(newInteger(0)); //2’  
Integerx=myIntList.iterator().next(); //3’

泛型和子类型 

List<Apple> apples = new ArrayList<Apple>(); //1  
List<Fruit> fruits = apples; //2  

 在这里,Apple是子类,Fruit是父类u,但第二行代码是错误的。

为什么一箱苹果就不是一箱水果了呢?可以这样考虑,我们假定第2行代码没有问题,那么我们可以使用语句fruits.add(new Strawberry())(Strawberry为Fruit的子类)在fruits中加入草莓了,但是这样的话,一个List中装入了各种不同类型的子类水果,这显然是不可以的,因为我们在取出List中的水果对象时,就分不清楚到底该转型为苹果还是草莓了。

java泛型

标签:

原文地址:http://www.cnblogs.com/JAYIT/p/5026298.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!