簡體   English   中英

如何在java中實現這個C#通用接口?

[英]How do I implement this C# generic interface in java?

好的,所以我已經玩了一段時間了,我開始相信泛型在Java中的工作方式不同,或者我錯過了一些東西。 我來自ac#background。

在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上的文章中找不到一些差異。 我希望有人可以對此有所了解?

請嘗試使用此界面:

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

(刪除您聲明的“方法本地”泛型類型,這可能會使您和/或編譯器感到困惑)。

然后,您的初始實現應該工作。

PS:在Java中使用單字母泛型類型也是慣例,因此Java開發人員會更熟悉<I, O>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM