Java多类型方法参数?

2022-09-02 02:42:31

我想知道是否有可能要求java方法参数是有限类型集中的任何类型。例如 - 我正在使用一个库,其中两个(或多个)类型具有通用方法,但它们在类型层次结构中的最低公共祖先是Object。我在这里的意思是:

   public interface A {
      void myMethod();
   }

   public interface B {
      void myMethod();
   }
...
   public void useMyMethod(A a) {
      // code duplication
   }

   public void useMyMethod(B b) {
      // code duplication
   }

我想避免代码重复。我想到的是这样的:

   public void useMyMethod(A|B obj){
      obj.myMethod();
   }

Java中已经存在类似类型的语法。例如:

  try{
     //fail
  } catch (IllegalArgumentException | IllegalStateException e){
     // use e safely here
  }

显然,这是不可能的。如何使用这种类型的不可编辑类型层次结构实现设计良好的代码?


答案 1

将函数作为参数传递给您的 useMyMethod 函数怎么样?

如果您使用的是 Java < 8:

public interface A {
    void myMethod();
}

public interface B {
    void myMethod();
}

public void useMyMethod(Callable<Void> myMethod) {
    try {
        myMethod.call();
    } catch(Exception e) {
        // handle exception of callable interface
    }
}

//Use

public void test() {
    interfaceA a = new ClassImplementingA();
    useMyMethod(new Callable<Void>() {
        public call() {
            a.myMethod();
            return null;
        }
    });

    interfaceB b = new ClassImplementingB();
    useMyMethod(new Callable<Void>() {
        public call() {
            b.myMethod();
            return null;
        }
    });
}

对于 Java >= 8,您可以使用 Lambda 表达式

public interface IMyMethod {
    void myMethod();
}

public void useMyMethod(IMyMethod theMethod) {
    theMethod.myMethod();
}

//Use

public void test() {
    interfaceA a = new ClassImplementingA();
    useMyMethod(() -> a.myMethod());

    interfaceB b = new ClassImplementingB();
    useMyMethod(() -> b.myMethod());
}

答案 2

尝试使用适配器设计模式。

或者,如果可能的话,添加一些基本接口:

public interface Base {
    void myMethod();
}

public interface A extends Base {}
public interface B extends Base {}
...
public void useMyMethod(Base b) {
    b.myMethod()
}

另外,您可以使用类似这样的东西


推荐