2011-08-19 33 views
0

試圖在IDEA中運行項目併發生異常。該項目始終僅在Eclipse上運行。Eclipse中的通用方法調用

下面是示例代碼:

package com.test; 

public class GenericMethod { 

    private Object value; 

    @SuppressWarnings("unchecked") 
    public <X> X getValue() { 
     return (X) value; 
    } 

    public void setValue(Object value) { 
     this.value = value; 
    } 
} 

和使用它的類:

package com.test; 

public class GenericMethodTest { 

    public static void main(String[] args) { 
     GenericMethod method = new GenericMethod(); 
     method.setValue(3); 

     int[] array = new int[] {1, 2}; 

     array[0] = method.getValue(); 
     System.out.println(array[0]); 
    } 
} 

所以,如果你試圖在Eclipse中運行這個例子 - 一切正常。它編譯並顯示正確的結果。

但是,如果你嘗試運行,比方說,在IDEA或者如果你只是使用ant或您的控制檯和javac命令 - 你會得到編譯錯誤:

Buildfile: C:\test\build.xml 

build: 
    [javac] C:\test\build.xml:13: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds 
    [javac] Compiling 1 source file to C:\test\bin 
    [javac] C:\test\src\com\test\GenericMethodTest.java:15: type parameters of <X>X cannot be determined; no unique maximal instance exists for type variable X with upper bounds int,java.lang.Object 
    [javac]   array[0] = method.getValue(); 
    [javac]         ^
    [javac] 1 error 

發生了什麼事?

Eclipse是否使用它自己的編譯器?

誰有bug?

回答

0

在這種情況下,您發佈的代碼有錯誤。 Eclipse讓它滑動(因爲你也用@SuppressWarnings(「unchecked」)告訴它),但是IDEA似乎並不那麼寬容。你不能將值轉換爲X,因爲由於擦除,你不知道X在運行時是什麼。

正確的方式做,這將是泛型化的類,然後儲值類型X.

public class GenericMethod<X> { 
    private X value; 

    public X getValue() { 
     return value; 
    } 

    public void setValue(X value) { 
     this.value = value; 
    } 
} 

如果你不能做到這一點,那麼不要嘗試在這裏使用仿製藥,只是施放。當然,如果你真的很熱衷於使用仿製藥,你也可以做這樣的事情:

public <X> X getValue(Class<X> clazz) { 
    return clazz.cast(value); 
} 

但你得有這個類。