- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
众所周知,arraylist init。应该是这样的
ArrayList<A> a = new ArrayList<A>();
ArrayList<Integer> a = new ArrayList<Number>(); // compile-time error
那么,为什么 java 允许这些?
1. ArrayList<? extends Object> a1 = new ArrayList<Object>();
2. ArrayList<?> a2 = new ArrayList<Integer>();
那么,如果它们是正确的,为什么不允许这些?
1. a1.add(3);
2. a2.add(3);
编译器消息是:ArrayList 类型中的方法 add(int, capture#1-of ? extends Object) 不适用于参数 (int)
更一般的
1. a1.add(null e);
2. a2.add(? e);
我读到了这个,但很高兴收到你的来信。谢谢
另一个有趣的地方是:
ArrayList<ArrayList<?>> a = new ArrayList<ArrayList<?>>(); // correct
ArrayList<?> a = new ArrayList<?>(); // wrong. I know it's reason but I have some
question in my mind that mentioned above
最佳答案
您不能分配 List<Number>
指向 List<Integer>
类型的引用因为List<Number>
允许 Integer
以外的数字类型.如果您被允许这样做,则允许执行以下操作:
List<Number> numbers = new ArrayList<Number>();
numbers.add(1.1); // add a double
List<Integer> ints = numbers;
Integer fail = ints.get(0); // ClassCastException!
类型List<Integer>
保证它包含的任何内容都是 Integer
.这就是为什么你可以得到 Integer
没有类型转换就可以了。如您所见,如果编译器允许 List
其他类型,例如 Number
分配给 List<Integer>
该保证将被打破。
分配 List<Integer>
指向类型的引用,例如 List<?>
或 List<? extends Number>
是合法的,因为 ?
表示“给定类型的某些未知子类型”(其中类型为 Object
在 ?
的情况下和 Number
在 ? extends Number
的情况下)。
自从 ?
表示您不知道 List
是什么具体类型的对象会接受,添加 null
以外的任何内容都是不合法的给它。但是,您可以从中检索任何对象,这是使用 ? extends X
的目的。有界通配符类型。请注意,? super X
的情况正好相反。有界通配符类型... a List<? super Integer>
是“一些未知类型的列表,至少是 Integer
的父类(super class)型”。虽然您不知道 List
的确切类型它是(可能是 List<Integer>
, List<Number>
, List<Object>
)你肯定知道它是一个 Integer
可以添加进去。
最后,new ArrayList<?>()
是不合法的,因为当您创建像 ArrayList
这样的参数化类的实例时,你必须给出一个特定的类型参数。你真的可以在你的例子中使用任何东西( Object
, Foo
,没关系),因为除了 null
之外你永远无法添加任何东西因为您将其直接分配给 ArrayList<?>
引用。
关于Java 泛型 - ArrayList 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4492950/
我是一名优秀的程序员,十分优秀!