使用java绑定通配符泛型的编译器错误

使用java绑定通配符泛型的编译器错误,java,generics,bounded-wildcard,Java,Generics,Bounded Wildcard,具有以下代码: Stack<Integer> integers = new Stack<Integer>(); Stack<? extends Number> numbers = integers; Number n = numbers.pop(); numbers.push(3); numbers.push(n); 堆栈整数=新堆栈(); 堆栈这里的答案非常清楚 这里的答案非常清楚 最后两行无效,因为数字可以是任何数

具有以下代码:

    Stack<Integer> integers = new Stack<Integer>();
    Stack<? extends Number> numbers = integers;
    Number n = numbers.pop();
    numbers.push(3);
    numbers.push(n);
堆栈整数=新堆栈();
堆栈这里的答案非常清楚
这里的答案非常清楚

最后两行无效,因为
数字
可以是任何数字类型的堆栈。考虑类似的代码:

Stack<Double> doubles = new Stack<Double>();
Stack<? extends Number> numbers = doubles;
Number n = numbers.pop();
numbers.push(3);
numbers.push(n);
Stack doubles=新堆栈();

堆栈最后两行无效,因为
numbers
可以是任何数字类型的堆栈。考虑类似的代码:

Stack<Double> doubles = new Stack<Double>();
Stack<? extends Number> numbers = doubles;
Number n = numbers.pop();
numbers.push(3);
numbers.push(n);
Stack doubles=新堆栈();

Java中的堆栈泛型协方差在客户端处理。i、 你没有语义来说明堆栈是协变的,让编译器检查你允许的操作(比如push)在协变模型中是否有效。(推不动)

这里的具体问题是,您可以这样做:

Number r = new Rational(a,b); // rationals are also numbers
number.push(r);
它在底层结构中暗示整数。push(r);//类型不匹配


(Scala中的编程在第19章中对客户端与提供者端(co-/contra-)的差异有一个非常清晰的解释。即使您不喜欢Scala,也推荐阅读)

Java中的泛型协方差在客户端处理。i、 你没有语义来说明堆栈是协变的,让编译器检查你允许的操作(比如push)在协变模型中是否有效。(推不动)

这里的具体问题是,您可以这样做:

Number r = new Rational(a,b); // rationals are also numbers
number.push(r);
它在底层结构中暗示整数。push(r);//类型不匹配


(Scala中的编程在第19章中有一个关于客户端与提供商端(co-/contra-)差异的非常清晰的解释。即使您不喜欢Scala,也推荐阅读)

请检查SO中的其他问题,这里有很多类似的问题。我已经搜索了其中的5-10个,它们似乎是关于如何播放列表的。请在SO检查其他问题,有很多与此类似的问题。我已经搜索了5-10个问题,它们似乎是关于如何通过阅读本文和@Cris提供的链接来发布列表。我似乎理解了手头的问题。但是,当堆栈上只有一个元素(类型为Integer)时,为什么编译器不能推断类型?@yas4891:编译器不打算从前面的代码行推断任何内容,而只是从变量的类型推断,这是
stack通过阅读本文和@Cris提供的链接,我似乎理解了眼前的问题。然而,当只有一个元素(类型为Integer)被推到堆栈上时,为什么编译器不能推断类型?@yas4891:编译器并不打算从前面的代码行中推断任何东西-只从变量的类型中推断,即
Stackwell有时更容易重定向到已经存在的有良好文档记录的响应。请相信我的回答:)这里所有花时间帮助你而不是帮助我的人……都值得:)有时候更容易重定向到已经存在的、记录良好的回答。请相信我的回答:)这里所有花时间帮助你比帮助我更多的人……值得:)