有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中使用泛型与语言运算符和泛型类扩展数

我想对同一类型的两个泛型参数执行一个操作,它们都扩展了Number

可能吗? 我总是对泛型参数调用方法,但似乎在使用运算符时出现了一些问题(运算符+对于参数类型T,T是未定义的)

public static <T extends Number> T sum(T a, T b){
    return a+ b;
}

我做错了什么

编辑: 我试着改进一下我的问题。我知道运算符不是为类型编号定义的。这件事有点让人伤心,因为在不引入@Victor Sorokin建议的新接口的情况下执行这样的操作会很好

但我仍然不明白一件事:如果操作符没有在类号中实现,那么至少应该在Double类中实现,因为我可以使用+操作符和Double。 这两行代码都不会编译:

public static <T extends Double> T sum(T a, T b){

    T c = a +b;
}

为什么?


共 (2) 个答案

  1. # 1 楼答案

    这是不可能的,因为Number没有与之关联的+运算符。特别是,您不能这样做:

    Number a = new Integer(1);
    Number b = new Integer(2);
    Number c = a + b;
    
  2. # 2 楼答案

    Java中的类没有+运算符(字符串除外,当其中一个参数为字符串时,通过toString()对其他类型进行隐式转换)。所以,让你输入实现一些接口,比如

    interface Valuable {
        // use richest built-in numeric type
        double value();
        Valuable value(double v);
    }
    
    public static <T extends Valuable> T sum(T a, T b){
        return a.value(a.value() + b.value());
    }
    

    难看,不是吗=D