如何在java中实现这个C#通用接口?

时间:2013-06-23 21:09:12

标签: c# java generics interface

好的,所以我已经玩了一段时间了,我开始相信仿制药在Java中的工作方式不同,或者我错过了一些东西。我来自c#背景。

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

1 个答案:

答案 0 :(得分:3)

请尝试使用此界面:

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

(删除您声明的“方法本地”泛型类型,这可能会使您和/或编译器感到困惑。)

然后,您的初始实施应该有效。

PS:在Java中使用单字母泛型类型也是惯例,因此Java开发人员会更熟悉<I, O>