嵌套通配符泛型变量实现

时间:2016-03-30 12:15:16

标签: java generics java-7 nested-generics

给出以下Java代码:

public class Test {
    public static class A<T> {
        private T t;

        public A(T t) {
            this.t = t;
        }

        public T getT() {
            return t;
        }

        public void setT(T t) {
            this.t = t;
        }
    }

    public static class B<T> {
        private T t;

        public B(T t) {
            this.t = t;
        }

        public T getT() {
            return t;
        }

        public void setT(T t) {
            this.t = t;
        }
    }

    public static class F<T> {
        private T t;

        public F(T t) {
            this.t = t;
        }

        public A<B<T>> construct() {
            return new A<>(new B<>(t));
        }

        public T getT() {
            return t;
        }

        public void setT(T t) {
            this.t = t;
        }
    }

    public static void main(String[] args) {
        F<?> f = new F<>(0);
        // 1: KO
        // A<B<?>> a = f.construct();
        // 2: KO
        // A<B<Object>> a = f.construct();
        // 3: OK
        // A<?> a = f.construct();
    }
}

Test类的主要方法中,接收f.construct()结果的变量的正确类型是什么? 此类型应类似于A<B<...>>,其中...正是我正在寻找的。

上面有3行注释代码,代表我尝试解决这个问题。 第一行和第二行无效。 第三个是但我放弃了B类型信息,我必须投射a.getT()

1 个答案:

答案 0 :(得分:1)

正如Paul Boddington所述,

A<? extends B<?>> a = f.construct();是正确的语法。