Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用泛型与语言运算符和泛型类扩展数_Java_Generics_Operators - Fatal编程技术网

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

如何在Java中使用泛型与语言运算符和泛型类扩展数,java,generics,operators,Java,Generics,Operators,我想对同一类型的两个泛型参数执行一个操作,它们都扩展了Number 可能吗? 我总是对泛型参数调用方法,但似乎在使用运算符时出现了一些问题(运算符+对于参数类型T,T是未定义的) 公共静态T和(ta,tb){ 返回a+b; } 我做错了什么 编辑: 我试着改进一下我的问题。我知道运算符不是为类型编号定义的。这件事有点让人伤心,因为在不引入@Victor Sorokin建议的新接口的情况下执行这样的操作会很好 但我仍然不明白一件事:如果操作符没有在类号中实现,那么至少应该在Double类中实现,

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

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

公共静态T和(ta,tb){
返回a+b;
}
我做错了什么

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

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

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

    T c = a +b;
}
公共静态T和(ta,tb){
tc=a+b;
}

为什么?

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

Number a = new Integer(1);
Number b = new Integer(2);
Number c = a + b;

Java中的类没有
+
运算符(字符串除外,当其中一个参数为String时,通过
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());
}
接口有价值{
//使用内置的数字类型
双值();
价值(双v);
}
公共静态T和(T a,T b){
返回a.value(a.value()+b.value());
}

难看,不是吗=D

当您尝试这样做时,是否会出现错误?错误说明了什么?
+
没有为
编号定义!它不能编译。Eclipse说:运算符+对于参数类型T是未定义的,T@thomson_matt@Victor Sorokin@Oli Charlesworth谢谢大家的帮助。我编辑了我的问题。你的新例子没有编译,原因不同。在运行时,由于类型擦除,JVM不知道它应该构造什么类型的
t
。实际上,不是强制转换,您错过了
new
关键字;)
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());
}