2016-12-15 18 views
2

C++からJavaへの移行。Java汎用インタフェース戻り型

私は実装する必要があるインタフェースを備えた第三者コードを持っていますが、このようなものになります。

public interface Foo<T>{ 
     public T doSomething(); 
} 

私は(doSomethingのを呼び出す)と、以下のように共通のベースZを拡張する3つの異なるクラスA, B and Cを得ることができるように、このインタフェースを実装します。

public class A extends Z{...}; 
public class B extends Z{...}; 
public class C extends Z{...}; 

次の3つのクラスの作成を避ける方法はありませんでした。指定されたインタフェースFooについては

public class ARet implements Foo<A>{...} 
public class BRet implements Foo<B>{...} 
public class CRet implements Foo<C>{...} 

public class Ret implements Foo<T extends Z>{...}ようになりT extends Z何かを返す実装を作成することはできません。これは動作していないようです。 3つのクラスを避ける方法はありますか、それともそのまわりにはありませんか?

答えて

6

あなたがインターフェイスの実装が一般的なようにしたい場合は、あなたがたRetのジェネリック型パラメータとしてTを宣言する必要があります:インターフェイスで

public class Ret<T extends Z> implements Foo<T>{...} 
+0

注関数のシグネチャ 'TのdoSomething()'。パラメータの1つとして 'T'オブジェクトを使用することなく、型' T'を返します。これは、返されるべきオブジェクト 'T 'が' doSomething() '関数で生成されなければならないことを意味します。私はJavaに慣れていませんが、これは型の削除のために可能ではないということでした。それとも私は概念を誤解していますか? – cplusplusrat

+1

@cplusplusratこれは、実装クラスが 'set(Tオブジェクト)'または 'T'インスタンスを実装クラスのインスタンスに渡す他のメソッドを持ち、' ​​something() 'メソッドがそのインスタンスを返すことを意味します。これは 'java.util.List 'インタフェースに似ています。 'get(int i)'メソッドは 'T'インスタンスを返します。あなたが 'Class '引数を渡さない限り、 'do'インスタンスは' doSomething() 'メソッドでは作成できません。 – Eran

+0

申し訳ありませんが、あなたのソリューションを動作させるには、setterメソッドをエスケープする必要がないので、 'doSomething()'が処理して戻すオブジェクトを持っています。それは私が思ったことだが、二次的な意見が必要だった。ありがとう。私はこれを解決済みとしてマークします。 – cplusplusrat

関連する問題