一次使用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];
没有编译错误,有编译警告:
Gen<?>[]
Gen<Object>[]
Gen<String>
Gen<Integer>
Gen<Object>[]
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 错误。
Gen<String>[]
还是 Gen<Integer>[]
,编译之后都是 Gen[]
,编译器不能保证数组里面存的到底是 Gen<String>
还是 Gen<Integer>
,干脆直接禁止创建泛型数组。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库