2个对象参数必须来自同一个类

时间:2016-04-13 10:18:46

标签: java

我想创建一个必须传递2个或更多Object参数的方法,它必须来自同一个类。
对象foo和bar必须是同一个类的成员。

public void method(Object foo, Object bar) {
}

我记得我之前见过这样的事情,但我不记得它是如何完成的。

public void method(Object<?> foo, Object<?> bar) {
}

4 个答案:

答案 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
}