此代码无法编译:
public class Calculadora<T> {
T suma(T a, T b) {
return (a + b);
}
}
Calculadora<Integer> c = new Calculadora<Integer>();
System.out.println(c.suma(3, 5));
它给了我错误
对于参数类型T,T
,运算符+未定义
我该如何解决?
答案 0 :(得分:4)
T可以是任何一类。它甚至可以是一个阵列。不能确保“+”运算符适用于给定的类。 为什么还要将泛型用于计算器?
答案 1 :(得分:1)
编译器不知道T
的类型,因此+
在某些情况下可能无效。
但是如果你希望用下面的泛型来实现这个,那么可以是一个解决方案:
public class Calculadora<T> {
Double suma(T a, T b) {
if (a instanceof Number && b instanceof Number) {
return (Double.parseDouble(a.toString()) + Double.parseDouble(b.toString()));
}
return 0d;
}
}
您必须覆盖toString
T
方法才能返回号码。
答案 2 :(得分:0)
好的,您尝试实施的方法是不可能的。好吧,至少对我来说。我不知道如何解决它。但无论如何,我会尝试解释你为什么会收到错误:
对于参数类型T,T
,运算符+未定义
这只是意味着, +
对T
类型的影响是什么?
嗯,当我们尝试做类似的事情时,这是有道理的:
Calculadora<Integer> c = new Calculadora<Integer>();
因为Integer
可以转换为int
,并且编译器确切知道如何将int
与int
一起添加到右边?
但由于T
可以是任何类型,如果我们做类似的事情会怎么样?
Calculadora<Cat> c = new Calculadora<Cat>();
显然,我们不知道你将如何添加Cat
与另一个Cat
。这就是编译器为什么会给你错误的原因,它告诉你,我不知道如何将这个类型添加到一起。我只能添加数字和字符串。
希望这会有所帮助。 :)
编辑2:
嗯,我看到它的方式,如果你真的需要这样做,你将不得不改变你的类和方法声明,如:
//Limit only the Generics to subtypes of Number
class Calculadora<T extends Number> {
//Return a specific type (Can be Double, Float, Long, etc.)
Integer suma(T a, T b) {
//Change this based on your return type (Can be double, float, long, etc.)
int sum = 0;
if (a instanceof Number && b instanceof Number) {
//Change this accordingly too (Can be doubleValue(), floatValue(), longValue(), etc.)
sum = a.intValue() + b.intValue();
}
return sum;
}
}
这仅适用于Integer
。如果需要,您可以将其更改为Number
的任何子类型。