1

いくつかの作業を行い、結果を生成するこのジェネリッククラスがあるとしましょう:

public abstract class Work<T> {

    private T mResult;

    public Work(T result) {
        mResult = result;
    }

    public abstract <T> void doWork(T result);

    public T getResult() {
        return mResult;
    }
}

このクラスのユーザーには、次のような型安全性が必要です。

Work<MyResult> work = new Work<MyResult>(new MyResult()){
    public void work(MyResult result){
        //...
    }
}

問題は、Javaがこのように機能せず、ジェネリック型からキャストすることを余儀なくされることです。

Work<MyResult> work = new Work<MyResult>(new MyResult()){
    public <T> void work (T result){
        // (MyResult)result - not nice
    }
}

最初の例のように、型の安全性をうまく保つ方法はありますか?

ありがとう、テオ

4

2 に答える 2

4

クラスレベルで宣言されたTを使用したいので<T>、の宣言にinは必要ありません-必要ですdoWork

public abstract void doWork(T result);

現在の宣言はと同じです

public abstract <A> void doWork(A result);

必ずしもクラスの他のメンバーと同じTである必要はありません。

于 2012-11-21T08:43:39.503 に答える
0

代わりにこれを試してください:

Work<MyResult> work = new Work<MyResult>(new MyResult()){
    public void work(MyResult result){
      // Do something
    }
}

クラスの現在のデザインはWork少し奇妙です。doWorkメソッドが引数として結果オブジェクトを必要とする理由がわかりません。抽象クラスも機能の面でほとんど提供していないようです(これはプロトタイプかもしれませんが)。おそらく、代わりにインターフェースを検討してください。

public interface Work<T> {    

    public T doWork();   
}
于 2012-11-21T08:44:23.697 に答える