2012-02-20 12 views
3

私はJavaのジェネリックスで問題が発生しましたが、同様の方法でジェネリックを使用している人のソリューションや例をオンラインで見つけることはできません。私は同じ要求/応答構造にあるメソッドのセットを持っています。たとえば、ユーザーがRequestオブジェクトのフィールドにデータを入力し、そのオブジェクトをヘルパメソッドに渡し、Responseオブジェクトが返されます。すべてのリクエストオブジェクトは、共通のリクエストスーパークラス(同様に、レスポンススーパークラスのレスポンスオブジェクト)から拡張されています。ヘルパークラスも一貫した構造にしたいので、インタフェースを使用しました。インタフェース内のJavaジェネリック

public class SuperRequest { 
    // ... 
} 

例リクエストサブクラス:

public class SubRequest extends SuperRequest { 
    // ... 
} 

応答スーパークラス:

public class SuperResponse { 
    // ... 
} 

例応答サブクラス:ここで...

リクエストスーパークラスを説明するためにいくつかのコードがあります

public class SubResponse extends SuperResponse{ 
    // ... 
} 

インタフェース:

public interface SomeInterface { 
    public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request); 
} 

あなたはインターフェースから見ることができるように、私はSuperRequestの子であり、私はSuperResponseの子であるオブジェクトを返すようにしたいオブジェクトを渡したいです。ここに私の実装です:Eclipseの

public class SomeImplementation implements SomeInterface { 

    @Override 
    public SubResponse someMethod(SubRequest request) { 
     return null; 
    } 
} 

コンパイラは、私が実装されていない方法と@Override表記「スーパータイプのメソッドをオーバーライドしない」を持っている私に語ったので、私はコンパイルエラーを取得します。

誰でも私を助けることができますか?私の構文が間違っているのですか?どんな助けでも大歓迎です!これは、特定のサブクラスを選択することはできません

public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request); 

:現状では、SomeInterfaceの実装はパラメータ化方法、すなわちを実装する必要があります

interface SomeInterface<T extends SuperRequest, U extends SuperResponse> { 
    public U someMethod(T request); 
} 

class SomeImplementation implements SomeInterface<SubRequest, SubResponse> { 

    @Override 
    public SubResponse someMethod(SubRequest request) { 
     return null; 
    } 
} 

答えて

7

はにあなたのインタフェースと実装を変更してみてくださいTUの代わりに使用します。

インターフェイス自体は汎用SomeInterface<T extends SuperRequest, U extends SuperResponse>でなければならず、サブクラスはTUの具体的な実装を選択できます。

+0

恐ろしいですね!私はシンタックス/宣言についてちょっとだけ離れていたと感じました。助けてくれてありがとう! – ggrigery

+0

問題なし、最良の回答を受け入れるようにしてください;) – ggreiner

1

インターフェイスを実装するときにも型を宣言する必要があります。試してみてください:

public class SomeImplementation implements SomeInterface<SubRequest,SubResponse> { 

    @Override 
    public SubResponse someMethod(SubRequest request) { 
     return null; 
    } 
}