之间有什么区别List,List<?>,List<T>,List<E>,和List<Object>?
现在我不要盲目地问这个问题,所以请不要关闭这个帖子.我先介绍一下基本代码:
public static void test(List<?> list){
System.out.println(list); // Works
}
Run Code Online (Sandbox Code Playgroud)
我明白:
1 List.:是原始类型,因此不是typesafe.它只会在强制转换时生成运行时错误.当演员表不好时我们想要编译时错误.不建议使用.
2 . List<?>:是一个无界的通配符.但不确定这是为了什么?所以如果我改变List<?>方法
public static void test(List<?> list){
list.add(new Long(2)); // Error
list.add("2"); // Error
System.out.println(list);
}
Run Code Online (Sandbox Code Playgroud)
它仍然很好.如果您能解释一下这种用法,我将不胜感激.
编辑:如果我这样做:
public static void test(List<T> list){ // T cannot be resolved
System.out.println(list);
}
Run Code Online (Sandbox Code Playgroud)
但如果我改成List<?>这个:
public <T> T[] toArray(T[] a){
return a;
}
Run Code Online (Sandbox Code Playgroud)
3 . <T>:
public static …Run Code Online (Sandbox Code Playgroud) 我正在刷新我对Java泛型的知识.所以我转向Oracle的优秀教程......并开始为我的同事准备一份演示文稿.我在教程中遇到了关于通配符的部分,其中说:
考虑以下方法,printList:
Run Code Online (Sandbox Code Playgroud)public static void printList(List<Object> list) { ...printList的目标是打印任何类型的列表,但它无法实现该目标 - 它只打印一个Object实例列表; 它不能打印
List<Integer>,List<String>,List<Double>,等等,因为它们不是的亚型List<Object>.要编写通用的printList方法,请使用List<?>:Run Code Online (Sandbox Code Playgroud)public static void printList(List<?> list) {
我明白这是List<Object>行不通的; 但我把代码更改为
static <E> void printObjects(List<E> list) {
for (E e : list) {
System.out.println(e.toString());
}
}
...
List<Object> objects = Arrays.<Object>asList("1", "two");
printObjects(objects);
List<Integer> integers = Arrays.asList(3, 4);
printObjects(integers);
Run Code Online (Sandbox Code Playgroud)
你猜怎么着; 使用List<E>我可以打印不同类型的列表没有任何问题.
长话短说:至少教程表明需要通配符来解决这个问题; 但如图所示,它也可以通过这种方式解决.那么,我错过了什么?!
(旁注:用Java7测试;所以这可能是Java5,Java6的一个问题;但另一方面,Oracle似乎在他们的教程更新方面做得很好)
我有一个方法,我想接受必须扩展抽象类的类类型.有什么区别
<T extends AbstractClass> void myMethod(Class<T> clazz);
和
void myMethod(Class<? extends AbstractClass> clazz); ?
在第二种情况下,我无法直接引用方法内部的类型.可以将哪些类类型传递给这两种方法有什么区别吗?