用绑定泛型计算

时间:2016-01-04 11:58:54

标签: java generics

我坚持使用类型保存编程。我试图制作一个通用的乘法方法。但算术运算符不能应用于我的泛型类型。 因此我将My generic扩展为Integer。以下是我的代码示例:

 public class Calculator<V extends Integer> {

  public <V extends Integer> V multiply(V value1, V value2) {
    return value1 * value2;
  }
}

我已经尝试在文献“Java ist auch eine Insel”中发现我的错误,并且我在网上搜索过。好吧,我相信你们中的一些人可以解决这个问题。我会感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

首先,您已经在类级别定义了类型参数<V extends Integer>,这很好,除非您重新定义了方法范围的类型参数<V extends Integer>。方法范围的类型参数隐藏类范围的参数,这是你的错误之一。

此外,<V extends Integer>由于各种原因没有多大意义:

由于Integer是一个final类,所以没有必要谈论“Integer可能的子类型,称为V”此外,乘法运算符(*)仅适用于数字类型及其包装器(并且由于没有证据表明V是这样的,因此编译失败了。)

刚刚:

public class Calculator {
    public Integer multiply(Integer value1, Integer value2) {
      return value1 * value2;
    }
}

编译正常,因为现在编译器将知道 value1value2可以从Integerint自动取消装箱可以正确应用乘法运算符。

总而言之,围绕某些泛型类型创建Calculator类并不是那么容易(主要是因为+-等数字运算符的类型范围很严格,{ {1}}等工作)。

答案 1 :(得分:0)

<V extends Integer>没有任何意义,因为Integer是最终成绩see javadoc,这意味着你无法从中扩展。您可以使用Number作为通用的超类,并使用.floatValue()获取值来乘以这些值。为了使其更加通用 - 使用BigDecimal而不是所有这些类型(不需要泛型,只需要一些拆箱/铸造)