我通过调整书中的一篇文章来编写这个简单的测试代码,以帮助我理解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;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:嗯,代码在更改时List<? super E>有效List<E>,这很好,但我仍然不确定我是否可能遗漏了某些内容,或者我从中获取的这本书可能有错误.请阅读那里出现的问题:
public static <E extends Number> List <?super E> process(List nums)
程序员想要像这样使用这个方法:
// INSERT DECLARATIONS HERE
output = process(input);
Run Code Online (Sandbox Code Playgroud)
可以在// 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.
Run Code Online (Sandbox Code Playgroud)
答案:B,E和F是正确的.返回类型的进程肯定被声明为a List,而不是a ArrayList,因此A和D是错误的.C是错误的,因为返回类型的计算结果为List<Integer>,并且无法将其赋值给类型的变量List<Number>.当然所有这些都可能导致
NullPointerException因为变量仍然是空的 - 但问题只是要求我们让代码进行编译.
本书中提到的所有选项都没有对我的代码起作用.我可以安全地将其标记为Kathy Sierra的错误,或者我在这里遗漏了什么?
问题是您声明方法的返回类型为
List<? super E>, i.e. List<? super Number>
Run Code Online (Sandbox Code Playgroud)
但是把它分配给一个
List<Number>
Run Code Online (Sandbox Code Playgroud)
所以你应该将它分配给一个
List<? super Number>
Run Code Online (Sandbox Code Playgroud)
或者将返回类型声明为
List<E> i.e. List<Number>
Run Code Online (Sandbox Code Playgroud)
(详细格式化,因为内联代码不能正确显示泛型.)
如果书中声称可以按照你描述的方式分配方法的返回值,那么这本书似乎确实是错误的.如果方法返回E列表(如上所述)将是正确的.
| 归档时间: |
|
| 查看次数: |
857 次 |
| 最近记录: |