我试图在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,它们可能被自动装箱并且应用了一个加号运算符,但是,可能有任何数量的其他未知数字后代无法自动装箱,直到运行时才能知道这一点.(该死的擦除)
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编译器正在重写最后一个语句("我必须拆箱a并b使用原始数据类型应用sum运算符,并将结果框分配给对象c"),因此:
Number c = Integer.valueOf( a.intValue() + b.intValue() );
Run Code Online (Sandbox Code Playgroud)
Java无法取消打包a,Number因为它在编译时不知道具体类型,因此无法猜测它的原始对应物.
你可以做这样的事情
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)
| 归档时间: |
|
| 查看次数: |
19994 次 |
| 最近记录: |