我编写了这个简单的测试代码,通过调整一本书的内容来帮助我理解Java中泛型方法的工作。我标记的行是假设工作,为什么不是?通用方法失败
import java.util.*;
class Test {
public static void main(String args[]){
List<Number> input = null;
List<Number> output=null;
output = Test.process(input); // fail, why??
}
public static <E extends Number> List <? super E> process (List <E> nums){
List <E>eList = new ArrayList<E>();
return eList;
}
}
编辑:嗯,代码改变List<? super E>
到List<E>
时的作品,这是伟大的,但我仍然不知道我可能已经错过了一些东西,或者如果我把这个从书中可能有错误。因为它似乎有请阅读问题:
- 鉴于声明的方法:
公共静态<é扩展号码>列表 <?超级E>进程(名单NUMS)
程序员想要使用此方法是这样的:
// INSERT DECLARATIONS HERE
output = process(input);
这对声明可以被放置在// INSERT DECLARATIONS这里允许 代码编译? (选择所有适用的。)
A. ArrayList<Integer> input = null;
ArrayList<Integer> output = null;
B. ArrayList<Integer> input = null;
List<Integer> output = null;
C. ArrayList<Integer> input = null;
List<Number> output = null;
D. List<Number> input = null;
ArrayList<Integer> output = null;
E. List<Number> input = null;
List<Number> output = null;
F. List<Integer> input = null;
List<Integer> output = null;
G. None of the above.
答案:B,E和F是正确的。 过程的返回类型肯定被声明为List
而不是ArrayList
,所以A和D 是错误的。 C是错误的,因为返回类型的计算结果为List<Integer>
,而不能将 分配给List<Number>
类型的变量。当然,所有这些可能会导致 NullPointerException
,因为变量仍然为空 - 但问题只是要求我们 获取代码进行编译。对书中提到的选项
都没有在我的代码工作。我可以安全地将它标记为Kathy Sierra的错误,还是我在这里错过了一些东西?
也许你的代码示例的简短解释? :) – 2009-02-18 03:24:00
噢.. 你为什么拿走名单 super E>? – andandandand 2009-02-18 03:25:43