2013-10-01 98 views
0

爲int我割我的牙齒上的Java(長時間C++這裏的傢伙),和我遇到一點問題Integer類轉換成原始類型爲int的。我已經看到了幾個解決方案,但沒有一個可以工作。整數轉換在Java泛型類

是什麼讓我的情況獨特的是轉換需要一個泛型類裏面的地方(整數作爲泛型參數)。該類擴展JProgressBar並繼承自定義(模板化)接口TaskObject。

代碼ProgressBar類:

private class ProgressBar<Integer> extends JProgressBar 
    implements TaskObject<Integer> { 

    @Override 
    public void update(Integer val) { 
     System.out.println("pbar updating to " + val); 
     setValue(val); 
    } 

} 

代碼TaskObject接口:

interface TaskObject<T> { 
    void update(T value); 
} 

的進度instacne作爲到的SwingWorker螺紋的類型TaskObject的傳遞和更新從該線程(因此update()函數)。

不幸的是,的setValue不會採取的類型整數,並使用(INT)失敗,與整數級轉換方法轉換沿。最後的具體錯誤提示「整數擴展在類... ProgressBar中聲明的對象」。

似乎很明顯,我使用Integer作爲通用參數的事實使編譯器在調用JProgressBar.setValue()時感到困惑......我對如何解決這個問題有一半想法,但好像而收效甚微很多工作,所以我想我會扔在那裏,看看別人有意見......

+0

你試過['val。的intValue()'](http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#intValue())? – Nikhil

+1

這是一個通用類。 Java中沒有模板,並且template!= generic。 – EJP

回答

1
private class ProgressBar<Integer> extends JProgressBar 
implements TaskObject<Integer> 

這裏使用的Integer實際上是定義具有無關java.lang.Integer類名爲「整數」的新類型參數。

什麼,你現在有相當於:

private class ProgressBar<MyTypeVariable> extends JProgressBar 
implements TaskObject<MyTypeVariable> { 

    @Override 
    public void update(MyTypeVariable val) { 
     System.out.println("pbar updating to " + val); 
     setValue(val); 
    } 

} 

因爲所有你正在試圖做的是落實TaskObject接口java.lang.Integer其類型參數T,把它定義爲:

private class ProgressBar extends JProgressBar 
implements TaskObject<Integer> { 

    @Override 
    public void update(Integer val) { 
     System.out.println("pbar updating to " + val); 
     setValue(val); 
    } 

} 

現在,您可以使用來調用JProgressBar的setValue(int)方法,因爲由於自動裝箱,編譯器會自動轉換該值。

+0

本來會給予thriqon的,如果你的答案只是他解決方案的一個例子。但是,您的解決方案立即清除了我只是將合法類型標識符重新用作通用參數名稱的想法。 –

0

您的代碼語法正確,但你有一個嚴重的缺陷:爲什麼你會選擇「整數」是你的類型參數?

private class ProgressBar<Integer>  // <-- here 
    extends JProgressBar 
    implements TaskObject<Integer> { 

你在你的類的方法,使用「整數」,當你認爲你正在使用Integer。擺脫ProgressBar的通用性(不需要,因爲JProgressBar實際上只接受數值)。換句話說,在Java中,您將模板參數放在中,而您從派生而不是新類。這是有意義的,因爲ProgressBar一個TaskObjectInteger個特殊的

TL;博士:ProgressBar不應該是通用的,TaskObject應該的。

+0

模板參數適用於繼承模式對我來說特別有用,因爲C++要求模板參數也應用於子類。感謝那。 –

+0

對於我的簡短回答感到抱歉,我很匆忙......我很高興有人能更全面地回答它。 – thriqon