相关疑难解决方法(0)

List,List <?>,List <T>,List <E>和List <Object>之间的区别

之间有什么区别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 generics

188
推荐指数
8
解决办法
15万
查看次数

Java泛型:通配符<?> vs类型参数<E>?

我正在刷新我对Java泛型的知识.所以我转向Oracle的优秀教程......并开始为我的同事准备一份演示文稿.我在教程中遇到了关于通配符的部分,其中说:

考虑以下方法,printList:

public static void printList(List<Object> list) {
...
Run Code Online (Sandbox Code Playgroud)

printList的目标是打印任何类型的列表,但它无法实现该目标 - 它只打印一个Object实例列表; 它不能打印List<Integer>,List<String>,List<Double>,等等,因为它们不是的亚型List<Object>.要编写通用的printList方法,请使用List<?>:

public static void printList(List<?> list) {
Run Code Online (Sandbox Code Playgroud)

我明白这是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似乎在他们的教程更新方面做得很好)

java generics

41
推荐指数
3
解决办法
9307
查看次数

Java Generics - 方法签名的上限

我有一个方法,我想接受必须扩展抽象类的类类型.有什么区别

<T extends AbstractClass> void myMethod(Class<T> clazz);

void myMethod(Class<? extends AbstractClass> clazz);

在第二种情况下,我无法直接引用方法内部的类型.可以将哪些类类型传递给这两种方法有什么区别吗?

java generics

7
推荐指数
1
解决办法
158
查看次数

标签 统计

generics ×3

java ×3