如何使方法的参数通用

how to make the parameters of a method generic

我应该在我的 class 中创建一个方法,它可以接受两种不同类型的对象作为参数,然后在该方法中我应该检查我收到的参数并执行以下操作。例如:

public void check(Object obj){
   if(obj istanceOf MyClassOne)
      ...
   else if(obj istanceOf MyClassTwo)
      ...

我该如何处理?

如果 类 不是彼此的 super/subclasses,您可以使用方法重载:

public void check(MyClassOne obj) {
    ....
}
public void check(MyClassTwo obj) {
    ....
}

当你调用check(someMyClassOne)时,它会编译使用第一种方法,对于check(someMyClassTwo),它会编译使用第二种方法。请注意,当您在调用 check 方法的地方已知类型时,这非常方便,否则您确实需要使您想要检查的所有对象扩展一个公共接口或检查它们是什么就像你已经在做的那样。

解决方案不明显。

考虑以下示例:

interface I {
    default void print(String method) {
        System.out.println(method + " => " + this.getClass().getCanonicalName());
    }
}

static class A implements I {}
static class A2 extends A {}
static class B implements I {}

static void print(A a) {
    a.print("print(A)");
}

static void print(A2 a2) {
    a2.print("print(A2)");
}

static void print(I i) {
    i.print("print(I)");
}

public static void main(String[] args) {
    print(new A());
    print(new A2());
    print(new B());
}

有输出

print(A) => Test.A
print(A2) => Test.A2
print(I) => Test.B

polymorphic 方法 print 明确承认 AA2I 类型。

注入到 print 的每个类型都将使用 print 多态性的不太通用的形式。这就是为什么 print(new A2()); 使用 A2 形式,尽管任何形式都适用于这种类型。

但是,在编译时只有是正确的,在运行时这是不正确的。

考虑以下示例:

A a2_really = (A) new A2();
print(a2_really);

注入的对象是A2但是,会用什么方法呢?

print(A) => Test.A2

由于在编译时解析,在运行时将使用A形式。

结论:

  • 如果你想在编译时强制使用一种或另一种方法,你可以编写一个多态方法。
  • 如果您想检查实例化方法(在运行时创建的对象),请使用反射或使用其他结构(如接口)对您的逻辑进行编码。