• 一次使用IDEA编写JDK动态代理Class数组中有关泛型的问题


    在一次使用idea工具进行jdk动态代理方法编写的时候,出现了一个[rawtypes]的编译错误,见下图:

     经过多次调试和搜集网上的资料,终于发现了问题的原因:

     因为jdk动态代理需要传入一个Class数组,虽然这样写Class[] classes = new Class[]{IndexService.class};编辑器不会报错误,但是在编译的时候就会报上面的错,这是idea的编译原理导致的,我们需要改成Class<?>[] classes = new Class<?>[]{IndexService.class};就可以顺利编译成功了。

     运行完结果正常显示:

     然后在网上查到idea对数组编译的一些条件限制,在这里列举出来。

    1 class Gen<T> {}
    2 
    3 Gen[] g0 = new Gen[10]; //ok
    4 Gen<?>[] g1 = new Gen<?>[10]; //ok
    5 Gen<Integer>[] g2 = new Gen[10]; //ok 为什么可以?
    6 Gen<Integer>[] g3 = new Gen<Integer>[10]; // error, g2可以,为什么g3不行

    我们一句句分析编译器和 IntelliJ IDEA 的行为。

      Gen[] g0 = new Gen[10];

      不会出现编译错误和警告,但 IntelliJ IDEA 会对左侧的 Gen[] 报 Raw use of parameterized class 'Gen' 警告。

      第一句没有问题,是因为 Java 认为这是 raw use of parameterized type,是兼容 1.5 以前没有泛型的旧语法。当然,现在不推荐这样写,失去了用泛型的意义,不利于类型安全。

      Gen<?>[] g1 = new Gen<?>[10];

      没有编译错误和警告,IDEA 也没有警告。

     第二句声明了 Gen<?>[],跟 Gen<Object>[] 基本是一样的,可以往里面填 Gen<String>,填Gen<Integer> 等等。这种写法绝大部分时候都没有意义,
    不如直接用 Gen<Object>[]

     Gen<Integer>[] g2 = new Gen[10];
    没有编译错误,有编译警告:
    1 Information:java: /C:/Code/TestJava/src/main/java/cnife/Main.java使用了未经检查或不安全的操作。
    2 Information:java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。

      同时,IDEA 会对右侧的 new Gen[10] 报 Unchecked assignment: 'cnife.Gen[]' to 'cnife.Gen<java.lang.Integer>[]' 警告。  

      第三句之所以有警告,是因为 Gen<Integer>[] 声明的变量有类型参数,因此编译器启用了类型检查,这时候再把 raw type 的 Gen[] 赋给变量就会触发警告,因为编译器不能保证 Gen[] 里的每个值都是 Gen<Integer> Gen<Integer>[] g3 = new Gen<Integer>[10];
    有编译错误:

    Error:(8, 29) java: 创建泛型数组
    
    

        IDEA 对 new Gen<Integer>[10] 报 Generic array creation 错误。

    
    
     第四句直接错误,在于启用了类型检查的编译器直接禁止创建泛型数组。因为 Java 的泛型是基于擦除实现的,所以不管是 Gen<String>[] 还是 Gen<Integer>[],编译之后都是 Gen[],编译器不能保证数组里面存的到底是 Gen<String> 还是 Gen<Integer>,干脆直接禁止创建泛型数组。
     
     
  • 相关阅读:
    Linux下的 .o、.a、.so文件
    第三章、主机规划与磁盘分区
    debian linux中文桌面系统安装
    C++开源库,欢迎补充。
    C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编号)
    C# CPU,硬盘,mac地址灯本地信息查询
    打造属于自己的支持版本迭代的Asp.Net Web Api Route
    PreApplicationStartMethodAttribute的使用
    Web Api in Orchard
    Dependency Injection in ASP.NET Web API 2 Using Unity
  • 原文地址:https://www.cnblogs.com/wk-missQ1/p/13111226.html
Copyright © 2020-2023  润新知