Java 不安全操作,未经检查的转换
当我编译以下类时(可用,已添加main方法以在单个类中重现问题),我在IntelliJ或maven命令行中收到以下编译器警告:Java 不安全操作,未经检查的转换,java,generics,compiler-construction,compiler-warnings,Java,Generics,Compiler Construction,Compiler Warnings,当我编译以下类时(可用,已添加main方法以在单个类中重现问题),我在IntelliJ或maven命令行中收到以下编译器警告: java: /Users/luigi/var/src/owner/src/test/java/org/aeonbits/owner/multithread/ThreadBase.java uses unchecked or unsafe operations. java: Recompile with -Xlint:unchecked for details. 然后,
java: /Users/luigi/var/src/owner/src/test/java/org/aeonbits/owner/multithread/ThreadBase.java uses unchecked or unsafe operations.
java: Recompile with -Xlint:unchecked for details.
然后,我将-Xlint:unchecked添加到maven以查看详细信息,结果如下:
[WARNING] /Users/luigi/var/src/owner/src/test/java/org/aeonbits/owner/multithread/ThreadBase.java:[74,45] unchecked conversion
required: java.util.List<java.lang.Throwable>
found: java.util.List
在pom.xml中,我添加了compiler.source和compiler.target 1.5,因为我的库的目标是jdk 1.5或更高版本:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<compilerArgument>-Xlint:unchecked</compilerArgument>
</configuration>
</plugin>
</plugins>
</pluginManagement>
org.apache.maven.plugins
maven编译器插件
3.1
1.5
1.5
-Xlint:未选中
谁能解释一下这里出了什么问题吗
对我来说,这没有任何意义,因为t.getErrors()返回一个列表:
List<Throwable> errors = t.getErrors();
List errors=t.getErrors();
这里怎么了 您的t
是ThreadBase
的原始类型
ThreadBase t = new ThreadBase(null, new Object(), 10) {
这意味着所有泛型都将被删除,即使是不相关的泛型,例如您的方法getErrors
,它将成为
public List getErrors() {
如果没有该警告,则无法将列表
分配给列表
如果要消除该警告,则不能有ThreadBase
的原始实例。初始化时提供类型参数,例如:
ThreadBase<Config> t = new ThreadBase<Config>(null, new Object(), 10) {
您的t
是ThreadBase
的原始类型
ThreadBase t = new ThreadBase(null, new Object(), 10) {
这意味着所有泛型都将被删除,即使是不相关的泛型,例如您的方法getErrors
,它将成为
public List getErrors() {
如果没有该警告,则无法将列表
分配给列表
如果要消除该警告,则不能有ThreadBase
的原始实例。初始化时提供类型参数,例如:
ThreadBase<Config> t = new ThreadBase<Config>(null, new Object(), 10) {
您不需要泛化ThreadBase,
t
是无用的。只需final Config cfg。。。ThreadBase(Config cfg…
字段T cfg
声明为默认可访问性,在子类中我使用类型T
,因此T
不是无用的。顺便说一句,这与我问的问题无关,也没有提供任何答案。您不需要泛化ThreadBase,t
是无用的。只需final Config cfg。。。ThreadBase(Config cfg…
字段T cfg
声明为默认可访问性,在子类中我使用类型T
,因此T
不是无用的。顺便说一句,这与我问的问题无关,也没有提供任何答案。为什么编译器会删除不相关的泛型?我相信这与保持与前泛型代码(前Java 1.5)的向后兼容性有关。谢谢,我解决了这个问题。在接受你的回答之前,我只是在等待关于这个(对我来说)奇怪行为的更多解释。再次感谢。+1@LuigiR.Viggiano请参阅此相关帖子:有趣。为什么编译器会删除不相关的泛型?我相信这与保持与前泛型代码(前Java 1.5)的向后兼容性有关。谢谢,我解决了这个问题。在接受你的回答之前,我只是在等待关于这个(对我来说)奇怪行为的更多解释。再次感谢。+1@LuigiR.Viggiano请参阅以下相关帖子: