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つのクラスを避ける方法はありますか、それともそのまわりにはありませんか?
注関数のシグネチャ 'TのdoSomething()'。パラメータの1つとして 'T'オブジェクトを使用することなく、型' T'を返します。これは、返されるべきオブジェクト 'T 'が' doSomething() '関数で生成されなければならないことを意味します。私はJavaに慣れていませんが、これは型の削除のために可能ではないということでした。それとも私は概念を誤解していますか? – cplusplusrat
@cplusplusratこれは、実装クラスが 'set(Tオブジェクト)'または 'T'インスタンスを実装クラスのインスタンスに渡す他のメソッドを持ち、' something() 'メソッドがそのインスタンスを返すことを意味します。これは 'java.util.List'インタフェースに似ています。 'get(int i)'メソッドは 'T'インスタンスを返します。あなたが 'Class '引数を渡さない限り、 'do'インスタンスは' doSomething() 'メソッドでは作成できません。 –
Eran
申し訳ありませんが、あなたのソリューションを動作させるには、setterメソッドをエスケープする必要がないので、 'doSomething()'が処理して戻すオブジェクトを持っています。それは私が思ったことだが、二次的な意見が必要だった。ありがとう。私はこれを解決済みとしてマークします。 – cplusplusrat