我通过调整书中的一篇文章来编写这个简单的测试代码,以帮助我理解Java中泛型方法的工作.我标记的那条线应该可以工作,为什么不呢?
import java.util.*; class Test { public static void main(String args[]){ Listinput = null; List output=null; output = Test.process(input); // fail, why?? } public static List super E> process (List nums){ List eList = new ArrayList (); return eList; } }
编辑:嗯,代码在更改时List super E>
有效List
,这很好,但我仍然不确定我是否可能遗漏了某些内容,或者我从中获取的这本书可能有错误.请阅读那里出现的问题:
给定一个声明为的方法:
public static
List <?super E> process(List nums)
程序员想要像这样使用这个方法:
// INSERT DECLARATIONS HERE output = process(input);
可以在// INSERT DECLARATIONS这里放置哪些声明对以允许代码编译?(选择所有适用的选项.)
A. ArrayListinput = null; ArrayList output = null; B. ArrayList input = null; List output = null; C. ArrayList input = null; List output = null; D. List input = null; ArrayList output = null; E. List input = null; List output = null; F. List input = null; List output = null; G. None of the above.
答案:B,E和F是正确的.返回类型的进程肯定被声明为a List
,而不是a ArrayList
,因此A和D是错误的.C是错误的,因为返回类型的计算结果为List
,并且无法将其赋值给类型的变量List
.当然所有这些都可能导致
NullPointerException
因为变量仍然是空的 - 但问题只是要求我们让代码进行编译.
本书中提到的所有选项都没有对我的代码起作用.我可以安全地将其标记为Kathy Sierra的错误,或者我在这里遗漏了什么?
问题是您声明方法的返回类型为
List super E>, i.e. List super Number>
但是把它分配给一个
List
所以你应该将它分配给一个
List super Number>
或者将返回类型声明为
Listi.e. List
(详细格式化,因为内联代码不能正确显示泛型.)
如果书中声称可以按照你描述的方式分配方法的返回值,那么这本书似乎确实是错误的.如果方法返回E列表(如上所述)将是正确的.