我在项目中遇到了一个奇怪的问题。现在我已经简化了问题并在这里写了一个小例子来说明我的困惑:
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>>)
更灵活。我可以将in1
或in2
传递给该方法。但两者都不能通过!有什么问题?
也许this answer会有所帮助。但我的问题是不同的!我的泛型类型是In<? super List<? super Q2>>
,泛型类型中的泛型类型。
答案 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) {}
};