Java Generic类型在没有中间变量的情况下失败

时间:2015-06-17 02:55:22

标签: java generics compilation

编译此示例代码时遇到意外错误(在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类型是继承而非显式)。即使那不应该改变返回类型,对吧?

我做错了吗?

1 个答案:

答案 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中这是必要的,但是使用几乎相同。如果我得到更好的解释,我会接受它作为答案。