通用方法失败

and*_*and 1 java generics

我通过调整书中的一篇文章来编写这个简单的测试代码,以帮助我理解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>,这很好,但我仍然不确定我是否可能遗漏了某些内容,或者我从中获取的这本书可能有错误.请阅读那里出现的问题:

  1. 给定一个声明为的方法:

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的错误,或者我在这里遗漏了什么?

Fab*_*eeg 7

问题是您声明方法的返回类型为

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列表(如上所述)将是正确的.