事实上,由于泛型参数将擦除到它的第一个边界,因此List<?>看起来等价于List实际上也是List<Object>。
List实际上表示"持有任何Object类型的原生List,而List<?>表示"具有某种特定类型的非原生List,只是我们现在不知道那种类型是什么"。
public static void test(List<?> list,Object o){
// (set capture of ?) can not be applied to Object
// list.add(o);
// cannot resolve symbol T
//T t = list.get(0);
Object r = list.get(0);
}
public static <T> T exact1(List<T> list){
T t = list.get(0);
return t;
}
public static void main(String[] args) {
List list = new ArrayList<Long>();
List<?> list1 = new ArrayList<Long>();
List<Long> list2 = new ArrayList<Long>();
Object oo = exact1(list1);
Long oo3 = exact1(list2);
}
```
**使用带有泛型类型参数的转型或instanceof 不会有任何效果**
```
//将会产生"unchecheked cast"
List list3 =(List<Long>) list1;
//要使用以下的方式
List list4 = List.class.cast(list1);
```