2013-05-23 16 views
9

私は、それぞれが異なる型と戻り値の型を使用するいくつかの異なるクラスによって実装されるインターフェイスを持っています。戻り値の型は、メソッドジェネリック型から推測できますが、実装には問題があります。ジェネリックインターフェイスを実装するときに具体的な型を返す方法

インタフェースが現在のようになります。私は、戻り値の型がどうあるべきかを知っIMPLで

public class TransformUtilsXCPD implements TransformUtilsBase<foo> { 

    bar transformToNhin(foo request, BrokerContext brokerContext) { 
     code here 
    } 

public interface TransformUtilsBase<T> { 

    Class<?> transformToNhin(T request, BrokerContext brokerContext); 
} 

私がするImplクラスが見えるようにしたいです。インタフェースレベルでは、教える方法がありません。

インターフェイスをすべてまとめて同じメソッド名でいくつかのクラスを作成するだけですが、すべて同じ目的のために使用されているため、正式化したかったのです。種類のみが異なります。

または、これらのクラスはutil操作なので、大きなクラスの静的メソッドを持つことはできますが、同じ名前の非常に多くのメソッドとすべての必要なヘルパーメソッドを持つクラスを扱うのが面倒になっていました同じ名前)。

私は静的メソッドを実行することはできませんが、インターフェイスを実装することは機能を正式化するための最良の選択肢のようです。私は戻り値の型に対処する方法を理解できません。

編集:さらなる混乱を避けるために、完全な例を示すようにインターフェイスで拡張してください。あなたにも戻り値の型のための型を宣言しない理由 インタフェース

public interface TransformUtilsBase<T, U> { 
    Class<?> transformToNhin(T request, BrokerContext brokerContext); 
    Class<?> transformToXca(U request, BrokerContext brokerContext); 
} 

Implを

public class TransformUtilsXCPD implements TransformUtilsBase<Foo, Bar> { 
    Baz transformToNhin(Foo request, BrokerContext brokerContext) { code here } 
    Biz transformToXca(Bar request, BrokerContext brokerContext) { code here } 
} 
+0

のサブクラスであるあなたは、実際のバズクラス、またはバズのインスタンスを返すようにしようとしています

public class TransformUtilsXCPD implements TransformUtilsBase<Foo, BarImpl> { BarImpl transformToNhin(Foo request, BrokerContext brokerContext) { //code here } } 

として宣言します実装するクラス?あなたの編集はそれが第二のものかもしれないことを暗示します。 – Alex

+0

良い点。私は変換プロセス中に作成されたBazクラスの特定のインスタンスを返そうとしています。ワイルドカード表記法は、戻り値の型を決定できるメソッド変数に対してのみジェネリックを提供するという意図した意図を伝えるための最良の方法です。 –

答えて

12

、あなたも "バインド" あなた戻すことができ、この

public interface TransformUtilsBase<T, S> { 

    S transformToNhin(T request, BrokerContext brokerContext); 
} 

のようなもの特定のタイプのタイプ(たとえば、Bar

public interface TransformUtilsBase<T, S extends Bar> { 

    S transformToNhin(T request, BrokerContext brokerContext); 
} 

BarImplBar

+0

Nitpick: 'S extends Class'部分は実際には最後の例で意味をなさない。なぜなら' Bar'は 'Class'を確実に拡張することができないからです。私は上の例として 'Class'以外のものを使っています。OPを混乱させたと思います。 –

+0

ありがとう@PaulBellora私は上の境界として 'クラス'を削除し、いくつかの他の例を与えました – sanbhat

+0

素晴らしいです! +1 –

関連する問題