Generics 使用泛型共享具有多个参数的公共方法

Generics 使用泛型共享具有多个参数的公共方法,generics,java-8,Generics,Java 8,我发现我有一个方法可以接受两种类型的列表对象。例如: public void foo(Long id) {}; 将对多个对象调用上述函数,每个对象的id类型为Long或Integer。发生的情况是,对于id定义为Long的对象,此方法调用可以正常工作: class Bar {Long id} Bar test = new Bar(1L); foo(bar.id); 但是对于具有整数id的对象,在使用foo之前,我必须首先将整数转换为Long。我当然可以有一个接受整数的新方法,但我宁愿不这样做

我发现我有一个方法可以接受两种类型的列表对象。例如:

public void foo(Long id) {};
将对多个对象调用上述函数,每个对象的id类型为Long或Integer。发生的情况是,对于id定义为Long的对象,此方法调用可以正常工作:

class Bar {Long id}
Bar test = new Bar(1L);
foo(bar.id);

但是对于具有整数id的对象,在使用foo之前,我必须首先将整数转换为Long。我当然可以有一个接受整数的新方法,但我宁愿不这样做。使用泛型有什么方法可以做到这一点吗?

没有。您不能定义一个类型是两种类型中的“或”

但是,您可以接受包含
Long
Integer
类型的
Number
,并使用其
longValue()
方法:

public void foo(Number number) {
    Long id = number.longValue();
    // rest of code stays the same
}

是否可以修改您的方法以处理其他数字类型,如
Double
Float
等?使用
Long
Integer
而不是
Long
int
的原因是什么?由于id的用例通常排除了
null
,因此除了希望遇到您描述的问题之外,我看不到任何其他情况。与使用
long
int
时一样,不需要显式转换…您可以通过将参数声明为
long
,然后将其装箱到方法内的
long
中(如果确实需要)来实现相同的转换。它的副作用是不允许输入,例如,
double
BigDecimal