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

标签 java generics compilation

我在编译此示例代码时遇到意外错误(在失败()方法中)。 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/

相关文章:

java - AsyncTask android - ExecutionException 错误

java - 如何在没有警告的情况下将通用工厂用于通用类型?

java - 最短的方法来看看 Maven 在 Eclipse 中的霸主地位?

java - 如何使用二维数组修复 Java 代码中的 "incompatible types"错误?

c# - 通用 InBetween 函数

c++ - 有没有一种智能的方法可以在编译时知道要链接到的库的名称? (Linux/库本图)

C++ 检查是否定义了 typedef

visual-c++ - MSVC 混合调试代码和发布代码

java - 库 appengine.api.datastore 和 com.google.cloud.datastore 之间有什么区别?

java - 去掉返回值中的通配符参数