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文件之中。

  • 相关阅读:
    225. Implement Stack using Queues
    150. Evaluate Reverse Polish Notation
    159 Longest Substring with At Most Two Distinct Characters
    142. Linked List Cycle II
    打印沙漏 (20 分)
    人见人爱A-B
    人见人爱A+B
    杨辉三角
    进制转换
    汉字统计
  • 原文地址:https://www.cnblogs.com/xiaolang8762400/p/7103893.html
Copyright © 2011-2022 走看看