java - 如何从不共享接口(interface)的两个类访问方法?

标签 java ksoap2 android-ksoap2 wsdl2java

我正在创建一个将访问 Web 服务的 java 库,但该库将在不同的平台上调用,因此我们使用 ksoap2 和 ksoap2-android 为不同的平台生成帮助程序类。问题是我们然后有两组生成的类/方法,它们的签名是等效的,但它们没有公开共享 Java 接口(interface) - 所以我想不出一种从我的主代码调用它们的方法。

一个简化的例子:

//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()

当然,最后一部分是伪代码。具体来说,如何在编译时不知道其类型且不符合特定接口(interface)的对象实例上调用 sayHi()?我希望有一些方法可以做到这一点,而无需手动编辑所有生成的类来添加“implements 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();
    }};
}

在某些情况下,子类化并添加到接口(interface)中可能是可能的,但可能是个坏主意,而且肯定不太灵活。

public class HiA extends A implements Hi {
}
public class HiB extends B implements Hi {
}

关于java - 如何从不共享接口(interface)的两个类访问方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16843800/

相关文章:

android - 如何使用tomcat构建一个web服务然后在android ksoap2中使用它

android - 如何在android中使用kso​​ap2库解析复杂的响应

android - 在 ksoap2 for android 中使用不带 "i:type="属性的 addMapping

android - ksoap2 序列化错误 "RuntimeException: Cannot serialize"

java - 以编程方式控制 Windows Media Player,最好使用 Java

java - 继承main方法

java - 未抛出 MethodArgumentNotValidException

Java - 如何在 JTextArea 中拆分整个单词

android - 这个错误在 eclipse(android) 中是什么意思,使用 ksoap2 访问 web 服务?

android - 导入 org.ksoap2.transport.AndroidHttpTransport 有问题;