泛型方法中的return语句出错

时间:2013-12-06 13:50:24

标签: java generics methods return

我的问题在于每个方法中的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();

    }
}

2 个答案:

答案 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)

你需要做这些事情:

  1. 将通用类型绑定到数字
  2. 制作add()等方法abstract并返回T
  3. 为您要支持的每种类型提供实施
  4. 像这样:

    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();
    }
    

    这里有很多自动装箱,这将无法通用,这就是为什么你需要为每种类型单独的类。