分类: Java
2016-07-25 15:15:29
语法糖只指在计算机语言中添加某种语法,这种语法不影响语言的功能。但是方便程序员使用,就是能够增加代码的可读性,减少程序代码出错的机会。
泛型,自动拆装箱,变长参数等。在虚拟机运行的时候是不支持这种语法的,他们在编译的时候就会被还原为简单的语法结构。这个过程就被称为结语法糖。
泛型与类型擦除
在java语言还没有泛型的时候,只能通过Object是所有类型的父类和类型强制转换来实现类型泛华。JDK1.5之前对HashMap的get方法返回的就是一个Object类型。但是由于java语言中所有类型的父类都是Object。因此只有程序员和jvm在运行期间才知道这个Object是什么类型,在编译阶段是无法判断这个类型是否被强制转换成功,因此在运行期间就会出现很多ClassCastException.Java中的泛型在编译成字节码的时候。就会被替换成原生态类型。对于运行期间的jvm来说HashMap
public class test {
public static void main(String args[]){
Map
map.put("name","123");
map.put("password","123");
System.out.println(map.get("name"));
}
}
将这段类编译成的class文件反编译会发现代码变成了:
public class test {
public static void main(String args[]){
Map map= new HashMap();
map.put("name","123");
map.put("password","123");
System.out.println((Strinng)map.get("name"));
}
}
之所以会这样,是因为编译期间就进行替换和强制转换动作。
但就是这种类型擦除带来了新的问题:比如
public class test {
public void get(Map
}
public void get(Map
return 0;
}
}
这段代码是无法反编译的,因为在编译期间就会擦除类型,最终是两个完全一样的函数。但是
public class test {
public void get(Map
}
public int get(Map
return 0;
}
}
这段代码是可以编译通过并且直接运行的。之前学习java的时候就说过,重载函数返回值是不会作为影响的。但这里由于java编译器在编译为class文件的时候发现返回值具有不同的签名,在class文件时允许的。这个意思就是编译通过之后,class文件时允许返回值不相同的方法(出去返回值,其他签名都相同)的方法存在,在编译阶段,由于方法具有不同的参数,此时还没有去除泛型前面的伪结构。即<,>里边的实际类型。