"超级"有什么问题? Java泛型

时间:2016-07-08 06:25:25

标签: 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!
    }
}

我的目标是使方法f(In<? super List<? super Q2>>)更灵活。我可以将in1in2传递给该方法。但两者都不能通过!有什么问题?

也许this answer会有所帮助。但我的问题是不同的!我的泛型类型是In<? super List<? super Q2>>,泛型类型中的泛型类型。

2 个答案:

答案 0 :(得分:2)

SELECT membership_end FROM table1 where membership_end>=now() Union all SELECT membership_end FROM table2 where membership_end>=now() 形式的通用类型意味着A<? extends B>可以替换为?或任何超类型的B。因此,B意味着:List<? super Q2>List<Object>List<Q1>

虽然List<Q2>Q1的超类型,但Q2不是List<Q1>的超类型。这意味着唯一常见的超级类型List<Q2>List<Object>List<Q1>List<Q2>。因此,您传递给Object方法的唯一方法是f

您需要如何解决这个问题取决于您实际需要的灵活性:您希望传递给In<Object>的对象类型以及想要对这些对象做什么?

答案 1 :(得分: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) {}
        };