有个 List 里有个 String 类型,List 可以赋值给 List 因为 Object 是 Number 的父类,而 String 类型 似乎被看成了 Object 对象 List a1 = new ArrayList(); a1.add('String'); List c = a1; System.out.p ..

List<? super T>

有个 List<Object> 里有个 String 类型,List 可以赋值给 List<? super Number>

因为 Object 是 Number 的父类,而 String 类型 似乎被看成了 Object 对象

List<Object> a1 = new ArrayList();
a1.add("String");
List<? super Number> c = a1;
System.out.println(c.get(0).getClass());

还是得到了 class java.lang.String -.-

因为 Object 是 Number 的父类,而 String 类型 似乎被看成了 Object 对象

List<Object> a1 = new ArrayList();
a1.add("String");
List<? super Number> c = a1;
System.out.println(c.get(0).getClass());

还是得到了 class java.lang.String -.-

讲道理 List<? super Number> 不应该存在 String 类型的对象,假如 String 对象被看成了 Object 对象,那么返回的不应该是 Object 类型吗? 😳

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2479 引用 • 7881 回帖 • 864 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    1374 引用 • 9010 回帖 • 575 关注
1 操作
ellenbboe 在 2019-08-10 20:43:40 更新了该帖
被采纳的回答
  • 88250

    getClass 子类重写没毛病。

3 回帖
请输入回帖内容...
  • 88250

    getClass 子类重写没毛病。

  • ayonel

    首先 c 和 a1 只是引用(c++ 中可以理解为指针)不同,但是都指向同一个堆中的对象(因为你只是简单的引用赋值)。这个 ArrayList 中的第一个对象"String",就是个 String 类型。 具体可以 google 下 "java 运行时类型 和 编译时类型"

  • xiaoFather

    刚刚了解了下,? extends Number 是上边界,即?的父类是 Number,? super Number 是下边界,即 Number 是底线,可以是 Number 的所有上级父类,这其中当然包括 Object,故这里取出来是没有问题的