Java Web 服务和多态性

Fil*_*erg 2 java polymorphism web-services

假设我有以下结构

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; }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您看到 Mammal me() 和 Human me() 被自然覆盖,这将完美运行,并且 WSDL 会按原样生成,因为我添加了 operationName=""。

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

现在我找到了一个解决方法,结果如下

在哺乳动物类中,我有这个: public ArrayList getAll(){ return null; }

我让 Humna 级保持不变,现在这有效。

然而!这使得无法扩展 Human 并覆盖来自新子类的方法,所以我又回到了原点。

我该如何解决这个问题?

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

jan*_*nko 5

即使没有与 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; }
}
Run Code Online (Sandbox Code Playgroud)

如果你想Human进一步扩展,那么你将不得不使用

public class Human extends Mammal {
    @WebMethod
    public List<? extends Human> getAll() { return null; }
}
Run Code Online (Sandbox Code Playgroud)