0

私はJavaで歯を食いしばっています(ここでは長年のC++の男です)、クラスIntegerをプリミティブ型intに変換する際に少し問題が発生しています。これに対するいくつかの解決策を見てきましたが、どれも機能していないようです。

私のケースをユニークにしているのは、変換がジェネリック クラス内で行われることです (Integer はジェネリック パラメーターです)。このクラスは 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);
}

ProgressBar インスタンスは TaskObject の型として SwingWorker スレッドに渡され、そのスレッドから更新されます (したがって update() 関数)。

残念ながら、setValue は Integer 型をとらず、(int) を使用した変換は、Integer クラスの変換メソッドと同様に失敗します。特定のエラーは、最後に「整数はクラスで宣言されたオブジェクトを拡張します...ProgressBar」と述べています。

Integer をジェネリック パラメータとして使用しているという事実が、JProgressBar.setValue() の呼び出しでコンパイラを混乱させていることは明らかなようです。少しの利益のために働くので、私はそれをそこに捨てて、他の誰かが意見を持っているかどうかを確認しようと思いました...

4

2 に答える 2

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

ここ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.IntegerT

private class ProgressBar extends JProgressBar 
implements TaskObject<Integer> {

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

}

setValue(int)JProgressBar のメソッドを呼び出すことができるようvalになりました。これは、オートボクシングのおかげで、コンパイラが値を自動的に変換するためです。

于 2013-10-01T05:08:22.203 に答える
0

あなたのコードは構文的には正しいのですが、重大な欠陥が 1 つあります。型パラメーターとして「Integer」を選択したのはなぜですか?

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

を使用していると思われる場合、クラスメソッドで「整数」を使用していますInteger。の汎用性を取り除きます (実際には数値のみを受け入れるProgressBarため、必要ありません)。つまり、Javaでは、新しいクラスではなく、派生元JProgressBarのクラスにテンプレート パラメーターを配置します。特別な種類の a for s のように、これは理にかなっています。ProgressBarTaskObjectInteger

tl;dr:ProgressBar一般的であってTaskObjectはなりません。

于 2013-10-01T04:47:43.670 に答える