我可以对Number基类进行算术运算吗?

Tom*_*ith 30 java

我试图在Java中创建一个将对数字执行操作的泛型类.在以下示例中,添加如下:

public class Example <T extends Number> {

    public T add(T a, T b){
        return a + b;
    }

}
Run Code Online (Sandbox Code Playgroud)

请原谅我的天真,因为我对Java Generics相对较新.此代码无法编译错误:

对于参数类型T,T,运算符+未定义

我认为通过添加"extends Number",代码将被编译.是否可以执行此Java或是否必须为每种Number类型创建重写方法?

Nat*_*ger 27

Number没有与之关联的+运算符,也没有运算符重载.

虽然这会很好.

基本上,你要求java自动装备一个数字的数字,其中包括Integer,Float和Double,它们可能被自动装箱并且应用了一个加号运算符,但是,可能有任何数量的其他未知数字后代无法自动装箱,直到运行时才能知道这一点.(该死的擦除)

  • "可能有任何其他未知的Number后代无法自动装箱",例如`BigInteger`和`BigDecimal`,它们都扩展了`Number`. (3认同)

leo*_*loy 20

您的问题与泛型无关,而与运算符,基元与对象以及自动装箱有关.

想一想:

public static void main(String[] args) {
    Number a = new Integer(2);
    Number b = new Integer(3);
    Number c = a + b;
}
Run Code Online (Sandbox Code Playgroud)

以上不编译

public static void main(String[] args) {
    Integer  a = new Integer(2);
    Integer b = new Integer(3);
    Number c = a + b;
}
Run Code Online (Sandbox Code Playgroud)

上述编译,但自动装箱只是因为-这是一种Java 5中引入哈克语法胶水,并且仅适用(在编译时),还有一些具体的类型:INT-整数.例如.

在幕后,Java编译器正在重写最后一个语句("我必须拆箱ab使用原始数据类型应用sum运算符,并将结果框分配给对象c"),因此:

    Number c = Integer.valueOf( a.intValue() + b.intValue() );
Run Code Online (Sandbox Code Playgroud)

Java无法取消打包a,Number因为它在编译时不知道具体类型,因此无法猜测它的原始对应物.


Sta*_*lin 5

你可以做这样的事情

    class Example <T extends Number> {
        public Number add(T a, T b){
            return new Double(a.doubleValue() + b.doubleValue());
        }
    }
Run Code Online (Sandbox Code Playgroud)