2013-06-25 38 views
0

當我編譯以下類(可用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(); 

有什麼錯在這裏?!?

+1

你不需要泛型化ThreadBase,'T'是無用。簡單地'最後配置cfg; ... ThreadBase(Config cfg ...)' – ZhongYu

+0

'T cfg'是用默認的可訪問性聲明的,在子類中我使用'T'類型,所以這就是爲什麼'T'不是無用的。順便說一句,這與我所問的問題無關,也沒有提供任何答案。 –

回答

5

您的t未加工類型ThreadBase

ThreadBase t = new ThreadBase(null, new Object(), 10) { 

這意味着,所有的仿製藥被刪除,甚至無關的內容,如你的方法getErrors,成爲

public List getErrors() { 

那麼你不能沒有的警告分配ListList<Throwable>

如果您想消除該警告,您必須而不是的原始實例爲ThreadBase。當初始化時,它提供一個類型參數,如:

ThreadBase<Config> t = new ThreadBase<Config>(null, new Object(), 10) { 

那麼你應該能夠與您現有的代碼成功調用getErrors

List<Throwable> errors = t.getErrors(); 
+0

有趣。和*爲什麼*編譯器刪除*無關的*泛型? –

+1

我相信它與維護與預代碼代碼(Java 1.5之前版本)的向後兼容性有關。 – rgettman

+0

我解決了這個問題,謝謝。在接受你的答案之前,等待有關這個(對我來說)奇怪行爲的額外解釋。再次感謝。 –

相關問題