如何在Java中创建无类型/通用参数?

时间:2010-08-03 16:49:23

标签: java types parameter-passing

所以说我有2个方法:一个添加两个int,另一个添加两个long。将参数传递给函数的地方。

如何制作一个概括参数和返回值的方法来执行此操作?

4 个答案:

答案 0 :(得分:6)

我在GWT中看到了这样的伎俩:

public static <T> T add(long a, long b)
{
    return (T)(Object)(a + b); 
}

像这样使用:

long answer = add(1L, 2L);
int answer2 = add(1, 2);

虽然这可以满足您的要求,但这种方法的缺点是它可以让您打开糟糕的类型转换。即使您不必显式转换返回的值,您仍然可以有效地告诉代码执行转换为任何预期类型。你可能会不小心说出类似的话:

String t = add(1, 2);

哪会导致运行时异常。尽管如此,如果你有一个方法,其返回值将在返回后立即转换,这个技巧可以为消费者节省显式转换值的麻烦。

答案 1 :(得分:3)

不幸的是,我认为你不能这样做。首先,Java generics can't be parameterized over primitives,因此您必须使用IntegerLong代替intlong。其次,虽然您可以使用泛型类型参数T extends Number的方法,但是无法以通用方式添加两个任意Number子类。换句话说,以下代码将工作:

public static <T extends Number> T add(T a, T b) {
    return a + b; // Won't compile, as the addition is not legal Java code.
}

答案 2 :(得分:1)

答案 3 :(得分:0)

long f(long x, long y){ ... }

int x=1, y=2;
f(x,y);