Java 不安全操作,未经检查的转换

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. 然后,

当我编译以下类时(可用,已添加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.
然后,我将-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请参阅以下相关帖子: