Java通用类型

时间:2014-09-24 07:55:47

标签: java generics types

此代码无法编译:

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

,运算符+未定义

我该如何解决?

3 个答案:

答案 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,并且编译器确切知道如何将intint一起添加到右边?

但由于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的任何子类型。