具有继承和泛型的Fluent API

具有继承和泛型的Fluent API,第1张

具有继承和泛型的Fluent API

从根本上说,您的代码是对泛型的不安全使用。例如,如果我编写一个扩展消息的新类(例如Threat),并具有一个新方法doSomething(),然后我创建一个由该新类参数化的消息,并创建Message的实例,然后尝试对其进行投射到其子类。但是,由于它是Message的实例,而不是Threat的实例,因此尝试调用此消息将导致异常。由于Message不可能执行doSOmething()。

此外,这里也不必使用泛型。普通的旧继承可以正常工作。由于子类型可以通过使返回类型更具体来覆盖方法,因此您可以:

public abstract class Message {    protected Message() {    }    public Message withID(String id) {        return this;    }}

然后

public class CommandMessage extends Message {    protected CommandMessage() {        super();    }    public static CommandMessage newMessage() {        return new CommandMessage();    }    public CommandMessage withCommand(String command) {        return this;    }}

如果您以正确的顺序调用参数,这将很好地工作:

CommandWithParamsMessage.newMessage()    .withID("do")    .withCommand("doAction")    .withParameter("arg", "value");

会失败,但是

CommandWithParamsMessage.newMessage().withParameter("arg", "value").withCommand("doAction").withID("do")

将成功,因为它仅“向上类型”,最后返回“消息”类。如果您不希望它“uptype”,则只需覆盖继承的命令,现在您可以按任何顺序调用方法,因为它们都返回原始类型。

例如

public class CommandWithParamsMessage extendsCommandMessage {    public static CommandWithParamsMessage newMessage() {        return new CommandWithParamsMessage();    }    public CommandWithParamsMessage withParameter(String paramName,        String paramValue) {        contents.put(paramName, paramValue);        return this;    }    @Override    public CommandWithParamsMessage withCommand(String command){        super.withCommand(command);        return this;   }    @Override    public CommandWithParamsMessage withID(String s){        super.withID(s);        return this;    }}

现在,您将流畅地返回一个CommandWithParamsMessage以及上面两个流畅的调用之一。

这是否解决了您的问题,还是我误解了您的意图?



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5488805.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存