1

这是一个很难尝试和搜索的问题,因为我没有看到其他类似的具体问题,所以如果我没有找到重复的线程,我深表歉意。这是一个与课堂作业无关的编程问题,我在完全按照规范实施时遇到了问题。

如果我想创建一个

Function<T>

泛型抽象类,其唯一的抽象方法是

Apply<T>(T input1, input2)

然后扩展到其他派生函数类,如 AddTwoNumbers 类,Apply 将返回 T 类型的 input1 和 input2 的总和(实际上这应该是 Integer 或 Double),我该如何实现呢?

我第一次遇到问题

public abstract class Function<T1 extends Number> {
    public abstract T1 apply(T1 input1, T1 input2);
}
public class AddTwoNumbers<T1 extends Number> extends Function<T1> {
    public T1 apply(T1 input1, T1 input2) {
        return input1.intValue() + input2.intValue(); //Error, needs to return type T1, not int or even Integer()
    }
}

要求 Function 是允许类型的泛型,但实际上可以预期 AddTwoNumbers 将专门为解决此问题而使用 Integers。有没有办法可以在 AddTwoNumbers 中编写 apply() 方法,这样

  1. AddTwoNumbers 完全实现了从 Function 继承的抽象方法
  2. 以某种方式添加两个 T1 值并正确返回 T1 值?

我不能安全地将 T1 转换为 Integer 并且还保留 Apply 的覆盖这一事实是麻烦的部分。

这是我正在研究的问题的概括。

4

2 回答 2

1
public class AddTwoIntegers extends Function< Integer > {
...
}
于 2013-10-04T03:28:53.913 回答
0

不幸的是,您所要求的在 Java 规范中是不可能的。没有抽象层可以同时考虑原语ints和原语doubles,或者实际上是原语的任何组合,因此您不得不为此创建两个类。

但是,有一些方法可以做到这一点,它们比编写AddTwoIntegers.java文件和AddTwoDoubles.java文件要好得多。

选项 1:创建一个AdditionFunctions类,并给它两个静态成员: INTSDOUBLES. 您可以轻松地使用匿名类来做到这一点。

选项 2:如果您可以将生成步骤合并到构建过程中,请使用模板。 Trove这样做效果很好

于 2013-10-04T03:54:06.253 回答