gpt4 book ai didi

Java Web 服务和多态性

转载 作者:行者123 更新时间:2023-11-30 07:38:54 25 4
gpt4 key购买 nike

假设我有以下结构

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() 被 natuarlly 覆盖,这完美地工作并且 WSDL 生成它应该是因为我添加了 operationName="".

到目前为止一切顺利,现在返回 ArrayList 的方法不起作用。它以某种方式表示 ArrayList 无法覆盖 ArrayList,我认为这应该是可能的?

现在我找到了解决方法,结果如下所示

在 Mammal 类中,我改为:public ArrayList getAll(){ return null; }

我让 Humna 级保持原样,现在它可以工作了。

但是!这使得扩展 Human 和覆盖新子类的方法变得不可能,所以我又回到了原点。

我该如何解决?

假设我想从 C# 应用程序访问 Web 服务,然后我希望该方法具有 List Human 或 List Whatever-extended-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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com