Java 通用类型在没有中间变量的情况下失败
Java Generic type is failing without an intermediate variable
我在编译此示例代码时遇到意外错误(在 fails() 方法中)。 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() 方法时发生,因为所有方法 return 都是相同的对象。
我真的很惊讶该方法适用于可从失败案例中分配的不同类型(其中 ToMessageOperation 类型是继承的而不是显式的)。即使这样也不应该改变 return 类型,对吧?
我是不是做错了什么?
我通过在 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;
}
使用工厂 class 进行自链接,代码如下所示:
public BootInfo fails() {
return get(BootInfo.class).runAll(selfLink()).now();
}
我不明白为什么这在 java 8 中是必要的,但使用起来几乎是等价的。如果我得到更好的解释,我会接受它作为答案。
我在编译此示例代码时遇到意外错误(在 fails() 方法中)。 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() 方法时发生,因为所有方法 return 都是相同的对象。
我真的很惊讶该方法适用于可从失败案例中分配的不同类型(其中 ToMessageOperation 类型是继承的而不是显式的)。即使这样也不应该改变 return 类型,对吧?
我是不是做错了什么?
我通过在 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;
}
使用工厂 class 进行自链接,代码如下所示:
public BootInfo fails() {
return get(BootInfo.class).runAll(selfLink()).now();
}
我不明白为什么这在 java 8 中是必要的,但使用起来几乎是等价的。如果我得到更好的解释,我会接受它作为答案。