如何从两个不共享接口的类访问方法?

Mik*_*man 4 java wsdl2java ksoap2 android-ksoap2

我正在创建一个将访问Web服务的java库,但是库将在不同的平台中调用,因此我们使用kso​​ap2和ksoap2-android为不同的平台生成帮助程序类.问题是我们有两组生成的类/方法,它们的签名是等价的,但是没有公开共享Java接口 - 所以我无法想办法从我的主代码中调用它们.

一个简化的例子:

//generated for Android
class A {
  public String sayHi() {
    return "Hi A";
  }
}

//generated for j2se
class B {
  public String sayHi() {
    return "Hi B";
  }
}

//main code - don't know how to do this
XXX talker = TalkerFactory.getInstance()
String greeting = talker.sayHi()
Run Code Online (Sandbox Code Playgroud)

当然,最后一部分是伪代码.具体来说,如何在一个对象的实例上调用sayHi(),我不知道编译时的类型,哪个不符合特定的接口?我希望有一些方法可以做到这一点,无需手动编辑所有生成的类来添加"实现iTalker".

Tom*_*ine 9

直接的方法是使用适配器.

interface Hi {
    void sayHi();
}

public static Hi asHi(final A target) {
    return new Hi() { public void sayHi() { // More concise from Java SE 8...
        target.sayHi();
    }};
}
public static Hi asHi(final B target) {
    return new Hi() { public void sayHi() { // More concise from Java SE 8...
        target.sayHi();
    }};
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,在接口中进行子类化和添加可能是可能的,但可能是一个坏主意,当然也不那么灵活.

public class HiA extends A implements Hi {
}
public class HiB extends B implements Hi {
}
Run Code Online (Sandbox Code Playgroud)