我坚持使用类型保存编程。我试图制作一个通用的乘法方法。但算术运算符不能应用于我的泛型类型。 因此我将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”中发现我的错误,并且我在网上搜索过。好吧,我相信你们中的一些人可以解决这个问题。我会感谢您的帮助。
答案 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;
}
}
编译正常,因为现在编译器将知道 value1
和value2
可以从Integer
到int
自动取消装箱可以正确应用乘法运算符。
总而言之,围绕某些泛型类型创建Calculator
类并不是那么容易(主要是因为+
,-
等数字运算符的类型范围很严格,{ {1}}等工作)。
答案 1 :(得分:0)
<V extends Integer>
没有任何意义,因为Integer是最终成绩see javadoc,这意味着你无法从中扩展。您可以使用Number作为通用的超类,并使用.floatValue()
获取值来乘以这些值。为了使其更加通用 - 使用BigDecimal而不是所有这些类型(不需要泛型,只需要一些拆箱/铸造)