Java泛型函数用于对整数执行计算,是否为double?

时间:2011-01-14 20:40:08

标签: java generics

这可能吗?当然,如果你传入一个double,任何一种将对象强制转换为Integer的函数实现代码都无法工作,除非专门使用强制转换'Integer'?我的功能如下:

public static void increment(Object o){
    Integer one = (Integer)o;
    system.out.println(one++);
}

我无法看到这对于双人来说如何变得通用?我试过了

public static <E> void increment(E obj){
    E one = (E)obj;
    system.out.println(one++);
}

但它不喜欢它?

5 个答案:

答案 0 :(得分:1)

在Java中,方法参数按值传递。因此,递增方法参数不会更改调用者的值。因此,您必须返回新值:

double increment(double x) {
    return x + 1;
}

或传递包含值的引用类型:

class MutableDouble {
    double value;
}

void increment(MutableDouble d) {
    d.value++;
}

在Java中,类型参数必须是引用类型,因此double不是类型参数的有效值。如果您需要基本类型,请考虑重载方法:

float increment(float f) {
    return f + 1;
}

double increment(double d) {
    return d + 1;
}

如果你真的想要泛型,你可以这样做:

@SuppressWarnings("unchecked")
<N extends Number> N increment(N n) {
    if (n instanceof Double) {
        return (N) (Double) (((Double)n) + 1);
    } else if (n instanceof Float) {
        return (N) (Float) (((Float)n) + 1);
    } else if ( ...
        // handle remaining cases
    } else if (n == null) {
        throw new NullPointerException();
    } else {
        throw new IllegalArgumentException("Unexpected number type: " + n.getClass());
    }
}

这虽然是丑陋的丑陋。你想通过定义这样一个方法来完成什么?可能有一种更简单的方法......

答案 1 :(得分:0)

如果你把它转发给双人怎么办?

public static void increment(Object o) {
    Double d= (Double) o;
    System.out.println(d + 1.0);
}

更新:我试过这个并且有效:

public static void increment(Object o) {
    Double d = Double.parseDouble(o.toString());
    System.out.println(d + 1.0);
}

答案 2 :(得分:0)

您可能希望阅读更高级别的专业语言已经从交叉类型算法定义的语义。我推荐的一个很好的例子是JSP EL规范。

它基本上阐明了如何实现这样的功能......

http://www.google.com/url?sa=t&source=web&cd=7&ved=0CEwQFjAG&url=http%3A%2F%2Fflaka.googlecode.com%2Ffiles%2Fjsp-2_1-fr-spec-el.pdf&rct=j&q=jsp%20el%20specification&ei=erkwTZrZGJHogQfbxMWiCw&usg=AFQjCNH6oPO7WwgiHCBkST5vgsBxMZmWaQ&sig2=0hRqxe6G0brRGuzNOxEhGw&cad=rja

答案 3 :(得分:0)

public static double increment(double d)
{
  return d+1;
}

这适用于所有原始值类型。然后你所要做的就是投射结果; - )

答案 4 :(得分:0)

假设您想要增加并获取新值(而不是更改不可变的Integer实例),您可以执行以下操作:

interface Arithmetics<T> {
    T inc(T val);
}

class IntegerArithmetics implements Arithmetics<Integer> {
    Integer inc(Integer val) { return val+1; }
}

//similarly DoubleArithmetics, BigIntegerArithmetics, ...

并调用它来获取您的方法:

public static <E> void increment(E obj, Arithmetics<E> arit){
    System.out.println(arit.inc(obj));
}

Generic Java Math库正是为您做的。

唯一的问题是你需要传递Arithmetics个对象。如果这是一个大问题,您可以初始化Map<Class,Arithmetics>,并使用map.get(obj.getClass())获取相应的Arithmetics