わかりましたので、私はこれをしばらくいじっていましたが、Java ではジェネリックが同じように機能しないか、何かが足りないと考え始めています。私は ac# 出身です。
C# では、次のようなジェネリック インターフェイスを実装できます。
public interface ICalculatorOperation<TInput, TOuput>
{
TOuput RunCalculation(TInput input);
}
public class MyCalculator : ICalculatorOperation<MyCalcInput, MyCalcOutput>
{
public MyCalcOutput RunCalculation(MyCalcInput input)
{
// implemented code ...
}
}
Java でこれと同じアプローチを試みたとき、これが私の最初の本能でした。
public interface Calculates<TInput, TOutput>{
<TInput, TOutput> TOutput RunCalculation(TInput input);
}
public class MyCalculator implements Calculates<MyCalcInput, MyCalcOutput>{
@override
public MyCalcOuput RunCalculation(MyCalcInput input){ // compile error, doesn't implement interface
// implemented code ...
}
}
しかし、ご覧のとおり、これはコンパイルされません。この実装に使用する具象型にパラメーターを設定しても、コンパイラーはインターフェイスの実際の署名を確認することを期待しています (申し訳ありませんが、これは私には奇妙です 笑)。
だから私はこれを試しました:
public class MyCalculator implements Calculates<MyCalcInput, MyCalcOutput>{
@override
public TOuput RunCalculation(TInput input){
MyCalcOutput result = new MyCalcOutput();
// set the results to this object
return result; // compile error, return type must be TOutput
}
}
メソッドのシグネチャはインターフェイスのシグネチャと一致し、コンパイラは満足していますが、return ステートメントが機能しません。
ネットで見つけたドキュメントや SO の記事からは見つけられなかったいくつかの違いがあることは明らかです。誰かがこれに光を当ててくれることを願っていますか?