【问题标题】:how to use generics in Java with language operators and generic class extending Number如何在 Java 中将泛型与语言运算符和扩展 Number 的泛型类一起使用
【发布时间】:2011-09-29 20:53:04
【问题描述】:

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

有可能吗? 我总是习惯于在泛型参数上调用方法,但使用运算符似乎存在一些问题(对于参数类型 T、T,运算符 + 未定义)。

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

我做错了什么?

编辑: 我试着改进一点我的问题。我知道没有为 Number 类型定义运算符。这件事有点可悲,因为如果不引入@Victor Sorokin 建议的新接口,执行这样的操作会很好。

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

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

    T c = a +b;
}

为什么?

【问题讨论】:

  • 您在尝试这样做时是否遇到错误?错误说明了什么?
  • + 没有为Number 定义!
  • 它无法编译。 Eclipse 说:运算符 + 未定义参数类型 T,T
  • @thomson_matt @Victor Sorokin @Oli Charlesworth 谢谢大家的帮助。我编辑了我的问题。
  • 您的新示例由于其他原因无法编译。在运行时,由于 类型擦除,JVM 不知道它应该构造什么类型的 T

标签: java generics operators


【解决方案1】:

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

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

【讨论】:

  • 其实不是演员,你错过了new关键字;)
【解决方案2】:

Java 中的类没有 + 运算符(String 除外,当参数之一是 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());
}

丑陋,不是吗? =D

【讨论】:

    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多