Java派生的数学函数泛型类

时间:2013-10-04 02:22:54

标签: java generics

这是一个难以尝试和搜索的问题,因为我没有看到像这样的其他特定问题,所以我很抱歉,如果结果是一个我找不到的重复线程。这是一个与课堂作业无关的编程问题,我完全按照规范实现了问题。

如果我想创建

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实现从函数完全继承的抽象方法
  2. 以某种方式添加两个T1值并正确返回T1值?
  3. 我不能安全地将T1转换为整数,并且保留覆盖的覆盖是一个麻烦的部分。

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

2 个答案:

答案 0 :(得分:1)

public class AddTwoIntegers extends Function< Integer > {
...
}

答案 1 :(得分:0)

遗憾的是,在Java规范中你无法提出要求。没有抽象层可以同时考虑原始ints和原始doubles,或者实际上是基元的任何组合,因此您不得不为此创建两个类。

但是,有一些方法可以比编写AddTwoIntegers.java文件和AddTwoDoubles.java文件好得多。

选项1:创建一个AdditionFunctions类,并为其提供两个静态成员:INTSDOUBLES。您可以轻松地使用匿名类来完成此操作。

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