2013-06-25 2 views
0

나는 다음 클래스, 나는 인 IntelliJ 또는 받는다는 명령 줄에서 다음과 같은 컴파일러 경고를 (주 방법은 하나의 클래스에 문제를 재현하기 위해 추가되었습니다 가능 here) 컴파일 할 때 :안전하지 않은 동작, 선택하지 않은 변환

를 세부 사항을 볼 수 받는다는을 선택 해제하고 나는이있어 :
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 추가

[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! 
    } 
} 

추가 세부 정보 : pom.xml 파일에서

$ 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" 

나는 compiler.source을 추가하고 내 라이브러리가 1.5 이상 JDK을 타겟으로하기 때문에 1.5 compiler.target :

<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> 

수있는 사람을 여기서 뭐가 잘못 됐는지 설명해 줄래? 여기에 잘못된 무엇

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

:

나를 위해, 그것은 t.getErrors (같은 이해가되지 않습니다)은 목록을 반환?!?

+1

,'T'입니다 편치 않은. 단순히 '최종 설정 cfg; ... ThreadBase (Config cfg ...)' – ZhongYu

+0

'T cfg' 필드는 기본 접근성으로 선언됩니다. 서브 클래스에서'T' 타입을 사용합니다. 그래서'T'는 쓸모가 없습니다. Btw, 내가 물어 본 질문과 관련이 없으며 어떤 대답도 제공하지 않습니다. –

답변

5

귀하의 t 유형 ThreadBase입니다. 모든 제네릭은 그럼 당신은 그 경고없이 ListList<Throwable> A를 할당 할 수 없습니다

public List getErrors() { 

된다 당신의 방법 getErrors로, 심지어는 관련이없는 사람을 제거하는 것을 의미

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

.

아니요의 원시 인스턴스가 ThreadBase 인 경우 해당 경고를 제거해야합니다. 를 초기화 할 때 유형 매개 변수를 제공, 예 :

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

그런 다음 기존 코드를 성공적으로 getErrors를 호출 할 수 있어야한다 : 당신이 ThreadBase을 generify 할 필요가 없습니다

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

흥미 롭습니다. 그리고 왜 * 컴파일러가 관련없는 제네릭을 제거합니까? –

+1

제네릭 사전 코드 (이전 Java 1.5)와의 하위 호환성 유지와 관련이 있다고 생각합니다. – rgettman

+0

나는이 문제를 해결했다. 대답을 수락하기 전에 (나를 위해) 이상한 행동에 대한 추가 설명을 기다리십시오. 다시 한번 감사드립니다. –