【问题标题】:Nested wildcard generics variable affectation嵌套通配符泛型变量影响
【发布时间】:2016-03-30 12:15:16
【问题描述】:

给定以下 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 类的main 方法中,将接收f.construct() 结果的变量的正确类型是什么? 这种类型应该类似于A&lt;B&lt;...&gt;&gt;,其中... 是我正在寻找的。​​p>

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

【问题讨论】:

  • 你为什么用F&lt;?&gt; f = new F&lt;&gt;(0);而不是,例如F&lt;Integer&gt; f = new F&lt;&gt;(0);
  • 因为f 并不总是受到F&lt;Integer&gt; 实例的影响。
  • 您将 0 作为参数传递。这是int
  • 这是一个例子,Integer可以替换成任何类型。
  • 我现在无法检查,但我认为 A&lt;? extends B&lt;?&gt;&gt; a = f.construct(); 是您想要的。

标签: java generics java-7 nested-generics


【解决方案1】:

A&lt;? extends B&lt;?&gt;&gt; a = f.construct(); 是正确的语法,如 Paul Boddington 所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多