簡體   English   中英

Java泛型類型中的“super”關鍵字有什么問題

[英]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>>)更加靈活。 我可以將in1in2傳遞給該方法。 但兩者都不能通過! 怎么了?

也許這個答案會有所幫助。 但我的問題是不同的! 我的通用類型是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>

雖然Q1Q2的超類型,但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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM