从根本上说,您的代码是对泛型的不安全使用。例如,如果我编写一个扩展消息的新类(例如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以及上面两个流畅的调用之一。
这是否解决了您的问题,还是我误解了您的意图?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)