Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17479
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 211
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-09 16:47
文章分类

全部博文(21)

文章存档

2017年(1)

2016年(9)

2015年(11)

我的朋友
最近访客

分类: Java

2016-07-25 15:15:29

语法糖只指在计算机语言中添加某种语法,这种语法不影响语言的功能。但是方便程序员使用,就是能够增加代码的可读性,减少程序代码出错的机会。

泛型,自动拆装箱,变长参数等。在虚拟机运行的时候是不支持这种语法的,他们在编译的时候就会被还原为简单的语法结构。这个过程就被称为结语法糖。

泛型与类型擦除

java语言还没有泛型的时候,只能通过Object是所有类型的父类和类型强制转换来实现类型泛华。JDK1.5之前对HashMapget方法返回的就是一个Object类型。但是由于java语言中所有类型的父类都是Object。因此只有程序员和jvm在运行期间才知道这个Object是什么类型,在编译阶段是无法判断这个类型是否被强制转换成功,因此在运行期间就会出现很多ClassCastException.Java中的泛型在编译成字节码的时候。就会被替换成原生态类型。对于运行期间的jvm来说HashMapHashMap是同一个类。

public class test {

   public static void main(String args[]){

      Map map= new HashMap();

      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 map){

     

   }

   public void get(Map int2){

      return 0;

   }

  

}

这段代码是无法反编译的,因为在编译期间就会擦除类型,最终是两个完全一样的函数。但是

public class test {

   public void get(Map map){

     

   }

   public int get(Map int2){

      return 0;

   }

}

这段代码是可以编译通过并且直接运行的。之前学习java的时候就说过,重载函数返回值是不会作为影响的。但这里由于java编译器在编译为class文件的时候发现返回值具有不同的签名,在class文件时允许的。这个意思就是编译通过之后,class文件时允许返回值不相同的方法(出去返回值,其他签名都相同)的方法存在,在编译阶段,由于方法具有不同的参数,此时还没有去除泛型前面的伪结构。即<,>里边的实际类型。

阅读(600) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~