2011-05-16 75 views
1

我有類似這樣的代碼:泛型問題 - 無法編譯代碼,可能是因爲類型擦除

public class A<E> { 
    protected E value; 

    public E getValue() { 
     return value; 
    } 

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

然後,我有一個類來擴展這個類,稱爲B

public class B extends A<Boolean> { 
    // B has some other code, but doesn't edit the set/get methods 
} 

然後我將這兩個類編譯爲A.class,B.class並且它們是JARed。

然後,我有以下代碼:

public class C { 
// ... snip 
    B var = new B(); 
    var.setValue(true); 
    if(var.getValue()) { 
     // etc 
    } 
// ... snip 
} 

試圖編譯這將導致一個錯誤,告訴我,var.getValue返回的對象。我知道這是一個布爾值,當我用A/B java文件包含C並且一次編譯完成時,它可以正常工作。

但是,當我分別編譯A/B到C我得到的問題,它認爲var.getValue是一個對象。

我一直在閱讀有關泛型和類型擦除,但我想不出一種方法來解決它。

我試圖建立一個類似C使用的包,但如果我必須施放所有getValues,那麼泛型沒有意義。

我哪裏錯了?

(實際的代碼是在this github repo,並且是A和B違規類ModOption/ModBooleanOption我沒有在那裏的C代碼,但很明顯。)

編輯:我使用JavaSE6編譯和混淆。奇怪的是,如果我經常編譯,然後嘗試這個例子也很好。我開始懷疑混淆器。

此問題已解決;我進一步測試,發現混淆器打破了泛型,我不知道爲什麼,不知道爲什麼。我會聯繫它的維護者。

+1

您使用的是什麼SDK?你的例子使用jdk1.6.0_25編譯得很好(單獨或一起)。 – jkraybill 2011-05-16 03:31:03

+0

@jkraybill Java SDK 6.在生產版本中,代碼針對混淆器(不是我的選擇)運行,這是唯一的區別。 – Clintonio 2011-05-16 03:47:54

+0

出於好奇,因爲問題是混淆器,你能分享你正在使用哪一個嗎? – 2011-06-01 04:38:31

回答

2

我能夠通過設置我的編譯器重現此javac -source 1.4而如果你使用的是IDE,檢查含有C,以確保您的Java虛擬機和源支撐位在1.5或項目編制C.以上。

+0

Java SDK 6.在生產版本中,代碼針對混淆器(不是我的選擇)運行,這是唯一的區別。 – Clintonio 2011-05-16 03:48:03

+0

事實證明,混淆器是古老的。業主不會升級。事實證明,我必須放棄它,只是不使用泛型。 – Clintonio 2011-06-22 11:55:56