Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中实现这个C#通用接口?_C#_Java_Generics_Interface - Fatal编程技术网

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

如何在java中实现这个C#通用接口?,c#,java,generics,interface,C#,Java,Generics,Interface,好的,我已经研究了一段时间了,我开始相信泛型在Java中的工作方式不一样,或者我遗漏了一些东西。我是c#出身 在C#中,我可能会实现这样一个通用接口: public interface ICalculatorOperation<TInput, TOuput> { TOuput RunCalculation(TInput input); } public class MyCalculator : ICalculatorOperation<MyCalcInput, MyC

好的,我已经研究了一段时间了,我开始相信泛型在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 ...
    }
}
公共接口iCalculator操作
{
TOPUT运行计算(TInput输入);
}
公共类MyCalculator:iCalculator操作
{
公共MyCalcOutput运行计算(MyCalInput输入)
{
//实现的代码。。。
}
}
当我尝试在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 ...
    }
}
公共接口计算{
TOutput运行计算(TInput输入);
}
公共类MyCalculator实现计算{
@凌驾
公共MyCalcOuput运行计算(MyCalInput输入){//编译错误,未实现接口
//实现的代码。。。
}
}
但正如您所看到的,这不会编译。即使我将参数设置为我将用于此实现的具体类型,编译器仍然希望看到接口的实际签名(对不起,这对我来说很奇怪lol)

所以我试了一下:

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
    }
}
公共类MyCalculator实现计算{
@凌驾
公共TOuput运行计算(TInput输入){
MyCalcOutput结果=新的MyCalcOutput();
//将结果设置为此对象
返回结果;//编译错误,返回类型必须为TOutput
}
}
现在,方法的签名与接口的签名匹配,编译器很高兴,但是现在我的return语句不起作用


很明显,我在网上找到的文档或这里的文章中没有发现一些差异。我希望有人能对此有所了解?

试试这个界面:

public interface Calculates<TInput, TOutput> {
    TOutput RunCalculation(TInput input);
}
公共接口计算{
TOutput运行计算(TInput输入);
}
(删除您声明的“方法本地”泛型类型,这可能会混淆您和/或编译器)

然后,您的初始实现应该可以工作


PS:在Java中使用单字母泛型类型也是一种惯例,因此Java开发人员更熟悉

看,它比你想象的更接近C-)我是说,我们偷了语言,应该很接近吧?英雄联盟