我的问题在于每个方法中的return语句,netbeans中的错误说:
线程中的异常" main" java.lang.RuntimeException:无法编译的源代码 - 二元运算符的错误操作数类型' +' 第一种:T 第二种:T 在GenericMath.add(GenericMath.java:8) 在GenericMath.main(GenericMath.java:20)
public class GenericMath<T> {
public T a,b;
public T add() {
return a+b;
}
public T multiply() {
return (a*b);
}
public static <T> void main(String[] args) {
GenericMath<Integer> x=new GenericMath<Integer>();
x.a=5;
x.b=10;
int z=x.add();
GenericMath<Double> y = new GenericMath<Double>();
y.a = 5.5;
y.b = 10.2;
double g=y.multiply();
}
}
答案 0 :(得分:5)
编译器不知道你可以相乘并添加T
值 - 它不是问题的return
部分,而是表达式本身。如果拆分这两部分,你会看到相同的效果:
T result = a + b;
return result;
这将是第一条失败的路线 - 而且没有特别干净的答案。泛型不仅仅是为Java中的这种工作而构建的。你可以做的是:
public abstract class GenericMath<T extends Number> {
public abstract T add(T a, T b);
public abstract T multiply(T a, T b);
// etc
}
public final class IntegerMath extends GenericMath<Integer> {
public Integer add(Integer a, Integer b) {
return a + b;
}
// etc
}
...以及DoubleMath
等的类似课程。
然后:
// Alternatively, have a static factory method in GenericMath...
GenericMath<Integer> math = new IntegerMath();
int x = math.add(5, 2);
答案 1 :(得分:0)
你需要做这些事情:
add()
等方法abstract
并返回T
像这样:
public abstract class GenericMath<T extends Number> {
public T a,b;
public abstract T add();
public abstract T multiply();
}
public class IntegerGenericMath extends GenericMath<Integer> {
public Integer add() {
return a + b;
}
public Integer multiply() {
return a * b;
}
}
// similar for Double
public static void main(String[] args) {
IntegerGenericMath x=new IntegerGenericMath();
x.a=5;
x.b=10;
int z=x.add();
DoubleGenericMath y = new DoubleGenericMath();
y.a = 5.5;
y.b = 10.2;
double g=y.multiply();
}
这里有很多自动装箱,这将无法通用,这就是为什么你需要为每种类型单独的类。