我想创建一个必须传递2个或更多Object参数的方法,它必须来自同一个类。
对象foo和bar必须是同一个类的成员。
public void method(Object foo, Object bar) {
}
我记得我之前见过这样的事情,但我不记得它是如何完成的。
public void method(Object<?> foo, Object<?> bar) {
}
答案 0 :(得分:3)
我认为你的意思是这样的:
public <T> void method(T foo, T bar) {
}
在这里,您可以定义没有任何边界的泛型类型T
,并且要求参数都是T
类型(或子类)。然后你可以这样称呼它:
method("string1", "string2"); //ok
method(Integer.valueOf(1), Long.valueOf(1) ); //works, Compiler will infer T = Number
this.<Integer>method(Integer.valueOf(1), Long.valueOf(1) ); //You set T = Integer, so the compiler will complain
答案 1 :(得分:2)
您可以通过检查对象的类来查看它们是否相同
public void method(Object foo, Object bar) {
if(!foo.getClass().equals(bar.getClass())) {
throw new IllegalArgumentException("Exception");
}
}
你不能用泛型来做这件事,因为java会自动将对象强制转换为Object
类。
public <T> void method(T foo, T bar, Class<T> clazz) {
}
这可以称为:
method("string 1", "string 2", String.class);
答案 2 :(得分:2)
试
public <T,U extends T> void method(T foo, U bar) {
}
答案 3 :(得分:0)
使用Java 8的另一种解决方案是使用这样的模式:
public <T> Consumer<T> method(T foo) {
return bar -> {
// do stuff;
};
}
@Test
public void test() {
method(Integer.valueOf(1)).accept(Long.valueOf(2)); // No good
method(Integer.valueOf(1)).accept(Integer.valueOf(1)); // ok
method((Number) Integer.valueOf(1)).accept(Long.valueOf(2)); // ok
}