1

わかりましたので、私はこれをしばらくいじっていましたが、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 の記事からは見つけられなかったいくつかの違いがあることは明らかです。誰かがこれに光を当ててくれることを願っていますか?

4

1 に答える 1

3

代わりにこのインターフェイスを試してください:

public interface Calculates<TInput, TOutput> {
    TOutput RunCalculation(TInput input);
}

(宣言した「メソッドローカル」ジェネリック型を削除します。これにより、おそらくあなたやコンパイラが混乱します)。

その後、最初の実装が機能するはずです。

PS: Java で 1 文字のジェネリック型を使用することも慣例であるため、<I, O>Java 開発者にはなじみがあるでしょう。

于 2013-06-23T21:14:02.190 に答える