深入JVM 语法糖-泛型

语法糖是程序语言提供给程序设计人员的用于提高开发效率,降低错误的设计。可以看作是编译器实现的小把戏,这些小把戏背后可能会使的效率提升,其中Java语言中最著名的是泛型

泛型是JDK1.5的一项新增特性,它的本质的参数化类型的应用,也就是说所操作类型被指定为一个参数。这种参数类型可以用在类,接口和方法的创建中,分别是泛型类,泛型接口,泛型方法

泛型思想早在C++语言的模板中就开始出现,在早版本的Java语言时期,只能通过Object是所有类型的父类和类型强制转换2个特点来配合实现类型泛化。

例如,在Hash表的存取中,JDK1.5以前采用HashMap的get()方法,返回一个Object对象,由于Java语言中所有类型都继承于Object,所有Object转成任何对象都是可能的,但缺点是运行期才能知道这个具体对象。在编译期间就无法获得更为精确的信息,如强制转化是否成功

泛型技术在不同语言实现中存在不同,如C#里无论是程序源码,编译后的IL中,或者运行期的CLR中,都是切实存在的,List 和List 就是2个不同的类型,它们在系统运行期生成,有自己的虚方法表和类型数据,这种方式实现的泛型称为真实泛型

而Java中的泛型则不一样,它只存在于程序源码中,在编译后的字节码中,就已经替换成原生类型,并且在相应的地方插入了强制类型转换的类型代码,因此,对于运行期的Java语言而言,ArrayList与ArrayList 就是同一个类,所以泛型技术实际上是Java语言的语法糖   也就是所谓的类型擦除,是一种伪泛型。

泛型擦除前的语句:

public static void main(String[] args) 
{
		Map map=new HashMap();
		map.put("hello","你好");
		System.out.println(map.get("hello"));
}

将Java文件编译成字节码文件.class文件,然后反编译后,发现泛型被擦除了

public static void main(String[] args) 
{
		Map map=new HashMap();
		map.put("hello","你好");
		System.out.println((String)map.get("hello"));
	
}

 关于Java泛型的争论,采用语法糖的方式被认为是表面的,从性能上说泛型由于需要强制类型转换而将导致运行速度更慢,在一些场景下表现不如意。

泛型遇到方法重载

public class javapTest {

	public static void method(List list)
	{
		System.out.println("Integer");
	}
	public static void method(List list)
	{
		System.out.println("String");
	}

}

 深入JVM 语法糖-泛型_第1张图片

发现拒绝编译,原因看似参数不同,能够重载,实际编译后经过类型擦除,

都是List类型,也就是参数列表相同,无法重载 

由此可见,Java的泛型机制的存在使得原有语法规则产生了混乱,在使用时需要注意

 

 

你可能感兴趣的:(Java基础,Java进阶)