當我編譯以下類(可用here,主要方法已被添加到重現問題在一個類中)時,我得到以下編譯器警告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:未選中到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
類源如下(主已經被添加到再現一個類的問題) :
package org.aeonbits.owner.multithread;
import org.aeonbits.owner.Config;
import org.aeonbits.owner.UtilTest.MyCloneable;
import java.util.ArrayList;
import java.util.List;
import static org.aeonbits.owner.UtilTest.debug;
abstract class ThreadBase<T extends Config> extends Thread implements MyCloneable {
private static long counter = 0;
final long uniqueThreadId = ++counter;
final T cfg;
final Object lock;
final int loops;
final List<Throwable> errors = new ArrayList<Throwable>();
ThreadBase(T cfg, Object lock, int loops) {
this.cfg = cfg;
this.lock = lock;
this.loops = loops;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public void run() {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
for (int i = 0; i < loops; i++) {
debug("%s[%d] started loop #%d.\n", getClass().getName(), uniqueThreadId, i);
try {
execute();
} catch (Throwable throwable) {
debug("%s[%d] thrown an error in loop #%d.\n", getClass().getName(), uniqueThreadId, i);
errors.add(throwable);
}
yield();
debug("%s[%d] completed loop #%d.\n", getClass().getName(), uniqueThreadId, i);
}
}
abstract void execute() throws Throwable;
public List<Throwable> getErrors() {
return errors;
}
public static void main(String[] args) {
ThreadBase t = new ThreadBase(null, new Object(), 10) {
@Override
void execute() throws Throwable {
}
};
List<Throwable> errors = t.getErrors();
// ^compiler reports the warning here!
}
}
其他細節:
$ mvn --version
Apache Maven 3.0.4 (r1232337; 2012-01-17 09:44:56+0100)
Maven home: /Users/luigi/opt/apache-maven-3.0.4
Java version: 1.7.0_25, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.8.4", arch: "x86_64", family: "mac"
在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>
能
人請解釋我這裏有什麼問題?
對我來說,沒有任何意義,因爲t.getErrors()返回一個列表:
List<Throwable> errors = t.getErrors();
有什麼錯在這裏?!?
你不需要泛型化ThreadBase,'T'是無用。簡單地'最後配置cfg; ... ThreadBase(Config cfg ...)' – ZhongYu
'T cfg'是用默認的可訪問性聲明的,在子類中我使用'T'類型,所以這就是爲什麼'T'不是無用的。順便說一句,這與我所問的問題無關,也沒有提供任何答案。 –