我正在创建一个可以访问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()

当然,最后一部分是伪代码。具体来说,如何在编译时不知道类型的对象实例上调用sayHi(),并且该对象不符合特定接口?我希望有某种方法可以手动编辑所有生成的类以添加“iTalker实现”。

最佳答案

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

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();
    }};
}

在某些情况下,可以继承子类并添加接口,但这可能是一个坏主意,当然也不太灵活。
public class HiA extends A implements Hi {
}
public class HiB extends B implements Hi {
}

09-30 12:29