zoukankan      html  css  js  c++  java
  • 深入理解JAVA虚拟机 程序编译和代码优化

    泛型类型擦除

    C#中的泛型,不论是代码中,还是编译后,还是运行期,都是切实存在的。List<String>和List<Int>是两个截然不同的类型,有自己的虚方法表和类型数据,这种实现称为类型膨胀。

    Java中的泛型是编译之后就消失了。只在代码中存在。

    当泛型遇见重载

    1. public class OverloadTest {
    2.     public void testType(List<String> list) {
    3.     System.out.println("String....");
    4. }
    5.  
    6. public void testType(List<Integer> list) {
    7.     System.out.println("Integer....");
    8. }
    9. }

    这连个方法重载是失败的,但是我们知道java的泛型是伪泛型,编译之后类型都被擦除了,因此这段代码不能通过编译,因为String类型和Integer类型被擦除之后,两个方法是一样的。

    1. public class OverloadTest {
    2.     public String testType(List<String> list) {
    3.     System.out.println("String....");
    4.     return "";
    5. }
    6.  
    7. public int testType(List<Integer> list) {
    8.     System.out.println("Integer....");
    9.     return 1;
    10. }
    11. }

    虽然返回值不能作为方法签名,但是这两个方法是可以编译通过的。这是java编译器的特殊处理。因为在class文件格式中,只要描述符不是完全一致的两个方法就可以共存。也就是两个方法如果有相同的名称和特征签名,但是返回值不同它们就可以合法的共存于一个class文件之中。

  • 相关阅读:
    创建百度地图实例
    IntelliJ IDEA使用(1)——IDEA配置JDK
    IntelliJ IDEA使用(2)——IDEA配置Tomcat
    怎样使用 GitHub?
    IntelliJ IDEA使用(3)——IDEA连接Git
    AS3.0杂记——Dictionary、Object与Array
    AIR文件操作:使用文件对象操作文件和目录 .
    As3.0 TextField
    关于乘机
    Html 嵌入 swf
  • 原文地址:https://www.cnblogs.com/xiaolang8762400/p/7103893.html
Copyright © 2011-2022 走看看