[英]What's wrong with the “super” keyword in Java generic type
我在項目中遇到了一個奇怪的問題。 現在我簡化了問題並在這里寫了一個小例子來說明我的困惑:
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
傳遞給該方法。 但兩者都不能通過! 怎么了?
也許這個答案會有所幫助。 但我的問題是不同的! 我的通用類型是In<? super List<? super Q2>>
In<? super List<? super Q2>>
In<? super List<? super Q2>>
,泛型類型中的泛型類型。
形式A<? extends B>
泛型類型 A<? extends B>
意味着?
可以用B
或任何超類型的B
代替。 因此, List<? super Q2>
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>
。
您需要如何解決這個問題取決於您實際需要的靈活性:您希望傳遞給f
的對象類型以及想要對這些對象做什么?
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) {}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.