泛型的擦除和转换

---------------------- android培训java培训、期待与您交流! ----------------------

 

泛型注意:擦除和转换
 在严格的泛型代码里,带泛型声明的类总是应该带着类型参数,但为了与老的java代码保持一致,也允许在使用带泛型声明的类时不指定类型参数。如果没有为这个泛型类指定类型参数,则该类型参数被称作一个raw type(原始类型),默认是声明该参数时指定的第一个上限类型。当把一个具有泛型信息的对象赋给另一个没有泛型信息的对象时,则所有在<>之间的类型信息都被扔掉了。比如说一个List<String>类型被转换为List,则该List对集合元素的类型检查编程了类型变量的上限(即Object)。

import java.util.List;
import java.util.ArrayList;

class Demo<T extends Number>
{
	T size;
	public Demo(){}
	public Demo(T size)
	{
		this.size = size;
	}
	public void setT(T size)
	{
		this.size = size;
	}
	public T getSize()
	{
		return this.size;
	}
}


 测试:

class TestEraser
{
	public static void main(String[] args)
	{
		//method1();
		method2();
		//method3();
	}
	
	/**
	把一个d赋给不带泛型信息的d2变量时,编译器会流失d对象的泛型信息,但因为Demo类型的参数类型上限是Number类,
	所以编译器依然知道d2.getSize()的返回值类型是Number类型。
	*/
	public static void method1()
	{
		Demo<Integer> d = new Demo<>(6);
		Integer id = d.getSize();
		
		Demo d2 = d; //把d对象赋给Demo类型的变量,会丢失泛型信息
		
		//Integer id2 = d2.getSize();  //编译错误
		Number id2 = d2.getSize();
	
	}
	
	/**
		下面程序中定义了一个List<Integer>对象,当把对象li赋给一个不带泛型的List变量list后,编译器
		就会流失前者的泛型信息,这就是擦除。但java允许直接把List对象赋给一个List<Type>(Type可以是
		任何类型)的变量。
		从逻辑上看,List<String> 是list的子类,如果直接把一个List对象赋给一个List<String>对象
		将引发编译错误,但对于泛型而言,可以直接把一个List对象赋给一个List<String>对象,编译器
		仅仅提示“未经检查的转换”,但要访问List<String>对象中的元素将会引发ClassCastException异常
	
	*/
	public static void method2()
	{
		List<Integer> li = new ArrayList<>();
		li.add(6);
		li.add(9);
		List list = li;
		List<String> ls = list; //警告,编译运行完全正常
		//但要访问ls集合里的元素,将会引起运行时异常
		System.out.println(ls.get(0));	
		
	}
	/**
		method2代码虽然可以编译通过,但实际上对list变量实际上引用的是List<Integer>集合,所以当试图
		把集合里的元素当成String类型的对象取出时,将引发ClassCastException类型转换异常,上面的代码
		可以转换成下面的代码就好理解了。
	*/

	public static void method3()
	{
		List li = new ArrayList();
		li.add(6);
		li.add(9);
		//运行异常
		System.out.println((String)li.get(0)); 
	}
}


其实用多态来解释比较容易,编译时只看左边,即对象变量的定义,运行时看右边,无论对象的引用如何变化,左边定义的变量都存放在栈内存中,而实际访问的是堆内存中的数据。

 

---------------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值