私はGoogle Web Toolkitを使用していますが、汎用インターフェースの実装に問題があります。私はジェネリックにはあまり詳しくないので、他の誰かのコードをここでアップグレードします。
これが私がしたいことです:いくつかのロギングを行うジェネリックコールバックインターフェイスの実装を用意し、特定のコールバックシナリオを処理するためにその実装をサブクラス化します。
インターフェースは次のようなものです:
public interface AsyncCallback<T> {
void MethodFromAsyncCallback(T result);
}
抽象的で具体的な実装は次のようになります。
class CallbackBase implements AsyncCallback<Object> {
public abstract void doStuff(Object result);
public void MethodFromAsyncCallback(Object result) {
// IMPORTANT STUFF
// here are things I would like to do for all callbacks, hence the superclass.
// Then we do the subclass specific things.
doStuff(result);
}
}
class SpecificCallback extends CallbackBase
{
public void doStuff(Object result) {
Integer i = (Integer)result;
// do stuff with i
}
}
コールバックは以下から発生する必要があります
public interface MyServiceAsync {
public void DoSomeThing(AsyncCallback<Integer>);
}
そして、すべてが次のような呼び出しでまとめられます。
MyServiceAsync myService = (MyServiceAsync)GWT.create(MyServiceAsync.class);
myService.DoSomeThing(new SpecificCallback());
そして、ここに問題があります!
GWT.create()
私が作成したインターフェースを実装する場合、AsyncCallback
指定された型を指定する必要があります(この質問の範囲外の別の場所の型と一致します)。したがってDoSomething(AsyncCallback<Integer>)
、オブジェクトではなく整数を作成します。これは私の制御を超えています。
それはDoSomething()
かかると文句を言うAsyncCallback<Integer>
。私はそれである何かから継承する何かをそれに与えていAsyncCallback<Object>
ます。ジェネリックスでは、継承の概念がいくらか壊れていると思いますか?
だから私の質問はこれです:
これをどのように組み合わせて、要件DoSomething()
をSpecificCallback
満たすことを認識できるか、
またはどのように私はとの関係構築できるCallbackBase
とSpecificCallback
そのコードの重複を回避しているが、そのSpecificCallback
実装AsyncCallback<Integer>
を直接?
ありがとう。
あなたがする必要があると私が思うのは次のCallbackBase
ように定義することです:
abstract class CallbackBase<T> implements AsyncCallback<T> {
public abstract void doStuff(T result);
public void MethodFromAsyncCallback(T result) {
// general stuff (T is a subclass of Object)
doStuff(result);
}
}
次に、特定のコールバックを次のようにします。
class SpecificCallback extends CallbackBase<Integer> {
public void doStuff(Integer result) {
// no need to cast
// do stuff with result
}
}
次に、あなたのDoSomething
受け付け方法は、AsyncCallback<Integer>
受け入れますSpecificCallback
。
(脚注:Javaではすべてのメソッドを小文字で開始してください)
編集する
価値があるのは、継承ではなく構成を使用するようにデザインを変更することです。この場合、抽象クラスを使用してCallbackBase
拡張するのではなく、次のAsyncCallback<T>
ような具象実装を使用します。
class GeneralCallbackWrapper<T> implements AsyncCallback<T> {
private final AsyncCallback<? super T> delegate;
public GeneralCallbackWrapper(AsyncCallback<? super T> delegate) {
this.delegate = delegate;
}
public void MethodFromAsyncCallback(T result) {
// general stuff here
delegate.MethodFromAsyncCallback(result);
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加