好的,所以我已经玩了一段时间了,我开始相信仿制药在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上的文章中找不到一些差异。我希望有人可以对此有所了解吗?
答案 0 :(得分:3)
请尝试使用此界面:
public interface Calculates<TInput, TOutput> {
TOutput RunCalculation(TInput input);
}
(删除您声明的“方法本地”泛型类型,这可能会使您和/或编译器感到困惑。)
然后,您的初始实施应该有效。
PS:在Java中使用单字母泛型类型也是惯例,因此Java开发人员会更熟悉<I, O>
。