如何在java中实现这个C#通用接口
本文关键字:接口 实现 java | 更新日期: 2023-09-27 18:19:31
好吧,所以我已经玩了一段时间了,我开始相信泛型在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
}
}
现在方法的签名与接口的签名匹配,编译器也很满意,但是现在我的返回语句不起作用。
很明显,我无法从网上的文档或SO上的文章中了解到一些差异。我希望有人能对此有所了解?
改为尝试此接口:
public interface Calculates<TInput, TOutput> {
TOutput RunCalculation(TInput input);
}
(删除您声明的"方法本地"泛型类型,这可能会混淆您和/或编译器)。
然后,您的初始实现应该会起作用。
附言:在Java中使用单字母泛型类型也是惯例,所以<I, O>
对Java开发人员来说会更熟悉。