Java泛型类型中的"super"关键字有什么问题

Eri*_*est 5 java super generic-type-argument

我在项目中遇到了一个奇怪的问题.现在我简化了问题并在这里写了一个小例子来说明我的困惑:

public class Question {
    class Q1 {}

    class Q2 extends Q1 {}

    interface In<T> {
        void f(T t);
    }

    List<Q2> list;

    void f(In<? super List<? super Q2>> in) {
        in.f(list);
    }

    static void g() {
        Question question = new Question();
        In<Collection<Q1>> in1 = new In<Collection<Q1>>() {
            @Override
            public void f(Collection<Q1> o) {}
        };
        In<List<Q2>> in2 = new In<List<Q2>>() {
            @Override
            public void f(List<Q2> o) {}
        };
        question.f(in1); //Error!
        question.f(in2); //Error!
    }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是使该方法f(In<? super List<? super Q2>>)更灵活.我可以通过in1in2该方法.但两者都不能通过!怎么了?

也许这个答案会有所帮助.但我的问题是不同的!我的泛型类型是In<? super List<? super Q2>>泛型类型中的泛型类型.

小智 0

In<Collection<? extends Q1>> in1 = new In<Collection<? extends Q1>>() {
            @Override
            public void f(Collection<? extends Q1> o) {}
        };
        In<List<? extends Q2>> in2 = new In<List<? extends Q2>>() {
            @Override
            public void f(List<? extends Q2> o) {}
        };
Run Code Online (Sandbox Code Playgroud)