我在编译此示例代码时遇到意外错误(在失败()方法中)。 IntelliJ 过去不会在 IDE 中报告错误,但后来开始报告错误(有些类在库中,这似乎让它感到困惑)
public class Main {
// The command
public interface ToMessageOperation<MODEL, MESSAGE> {
void run(MODEL object, MESSAGE message) throws Exception;
}
// A command
public class SelfLink<MODEL> implements ToMessageOperation<MODEL, LinkedMessage> {
@Override
public void run(MODEL object, LinkedMessage linkedMessage) throws Exception {
}
}
// A message type
public interface LinkedMessage {
void linkme();
}
// A message
public interface BootInfo extends LinkedMessage {
}
//The Executor
public interface GetRequest<MODEL, MESSAGE> {
GetRequest<MODEL, MESSAGE> runAll(ToMessageOperation<? super MODEL, ? super MESSAGE>... operations);
GetRequest<MODEL, MESSAGE> cleanUp();
MESSAGE now();
}
// The command factory
public SelfLink selfLink() {
return null;
}
public <MODEL, MESSAGE> GetRequest<MODEL,MESSAGE> get(Class<MESSAGE> message) {
return null;
}
public BootInfo works() {
return get(BootInfo.class).cleanUp().now();
}
public BootInfo alsoWorks() {
return get(BootInfo.class).runAll(new ToMessageOperation<Object, BootInfo>() {
@Override
public void run(Object object, BootInfo bootInfo) throws Exception {
}
}).now();
}
public BootInfo surprisedItWorks() {
return get(BootInfo.class).runAll(new ToMessageOperation<Object, LinkedMessage>() {
@Override
public void run(Object object, LinkedMessage message) throws Exception {
}
}).now();
}
public BootInfo fails() {
return get(BootInfo.class).runAll(new SelfLink()).now();
}
}
令我有点惊讶的是,只有在添加 runAll() 方法时才会发生错误,因为所有方法都返回相同的对象。
我真的很惊讶该方法适用于可从失败案例中分配的不同类型(其中 ToMessageOperation 类型是继承的而不是显式的)。即使这样也不应该改变返回类型,对吗?
我做错了什么吗?
最佳答案
我通过在 SelfLink 上添加显式通用参数来快速修复该问题
public class SelfLink<MODEL,MESSAGE extends LinkedMessage> implements ToMessageOperation<MODEL, MESSAGE> {
@Override
public void run(MODEL object, MESSAGE linkedMessage) throws Exception {
linkedMessage.linkme();
}
}
public <MODEL,MESSAGE extends LinkedMessage> SelfLink<MODEL, MESSAGE> selfLink() {
return null;
}
使用工厂类进行自链接,代码如下:
public BootInfo fails() {
return get(BootInfo.class).runAll(selfLink()).now();
}
我不明白为什么这在 java 8 中是必要的,但使用几乎是等效的。如果我得到更好的解释,我会接受它作为答案。
关于Java 泛型类型在没有中间变量的情况下失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30881548/