Java Web 服务和多态性

标签 java web-services polymorphism

假设我有以下结构

public class Mammal
{
    @WebMethod
    public ArrayList<Mammal> getAll(){ return null; }
    @WebMethod
    public String speak(){ return "Unable to speak"; }
    @WebMethod
    public Mammal me(){ return this; }  
}

@WebService
public class Human extends Mammal
{
    @WebMethod
    public ArrayList<Human> getAll(){ /* code to return all humans as ArrayList<Human> */ }
    @WebMethod
    public String speak() { return "Hai!"; }
    @WebMethod(operationName="GetHuman")
    public Human me(){ return this; }
}

现在,如果您看到 Mammal me() 和 Human me() 被自然地覆盖,并且效果完美,并且 WSDL 已按其应有的方式生成,因为我添加了 operationName=""。

到目前为止一切顺利,现在返回 ArrayList 的方法不起作用。不知怎的,它说 ArrayList 不能覆盖 ArrayList,在我看来这应该是可能的?

现在我找到了解决这个问题的方法,结果如下

在 Mammal 类中,我有这个: public ArrayList getAll(){ return null; }

我保持 Humna 级不变,现在可以了。

但是!这使得不可能扩展人类并重写新子类中的方法,所以我又回到了第一个方向。

如何解决这个问题?

假设我想从 C# 应用程序访问 Web 服务,然后我希望该方法具有 List Human 或 List What-extend-Mammal 的返回类型,而无需在另一端进行类型转换!

最佳答案

即使没有与 Web 服务相关的注释,您的代码示例也不应该编译。 List<Human> 不是 List<Mammal> 的子类型。但是,如果您使用 List<? extends Mammal>在你的基类中,那么一切都应该正常工作。

public class Mammal
{
    @WebMethod
    public List<? extends Mammal> getAll() { return null; }
}

public class Human extends Mammal {
    @WebMethod
    public List<Human> getAll() { return null; }
}

如果您想延长Human更进一步,那么你将不得不使用

public class Human extends Mammal {
    @WebMethod
    public List<? extends Human> getAll() { return null; }
}

关于Java Web 服务和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1377999/

相关文章:

java - 如何使用selenium webdriver配置网页语言

java - 如何在Java中将8个字符的字符串转换为ARGB颜色格式?

java - struts 2 jquery 插件不工作

jquery - 无法在浏览器中手动访问 ASMX Web 服务,但可以使用 jQuery

java - 依次调用15个Web服务

reflection - 如何检查 Rust 的编译时是否实现了特征?

ruby-on-rails - Rails : Polymorphism, String:Class 的未定义方法 `primary_key'

java - 从java中的json数组中拆分json对象

android - 如何使用 Jersey 在 Android 应用程序中托管 Rest API 服务器?

java - 如何将常量传递给方法?