编译此示例代码时遇到意外错误(在fail()方法中)。 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类型是继承而非显式)。即使那不应该改变返回类型,对吧?
我做错了吗?
答案 0 :(得分:0)
我通过在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中这是必要的,但是使用几乎相同。如果我得到更好的解释,我会接受它作为答案。