【问题标题】:What is meaning of <E extends Number> List<? super E> return type of method in java [duplicate]<E extends Number> List< 是什么意思? super E> java中方法的返回类型[重复]
【发布时间】:2013-12-01 03:39:09
【问题描述】:

我正在阅读 OCJP 问题,并且在给出以下方法签名中发现了一个问题。

public static <E extends Number> List<? super E> process(List<E> nums)

我想知道返回类型到底是什么,或者写成返回类型的&lt;E extends Number&gt; List&lt;? super E&gt; 是什么意思。

让我给出整个问题。

给定一个声明为的方法:

public static <E extends Number> List<? super E> process(List<E> nums)

程序员想这样使用这个方法:

// 在此处插入声明

output = process(input);

可以放在哪对声明

// 在此处插入声明

允许 要编译的代码? (选择所有适用的。)

一个。

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.以上都不是。

答案:

乙,乙, 和 F 是正确的

【问题讨论】:

标签: java generics collections return-type


【解决方案1】:

对于这个泛型方法,返回类型由参数类型决定。参数可以是List&lt;Number&gt; 和 Number 的子类型列表。例如,如果您使用此参数调用进程

List<Integer> list = ...
process(list)

返回类型将为List&lt;? super Integer&gt;。带有? super 的泛型类型只能分配给带有? super 的泛型类型

List<Integer> input = null;
List<? super Integer> output = process(input);

它不能是List&lt;Number&gt;List&lt;Object&gt;,因为它们允许编写泛型参数的子类。例如List&lt;Number&gt; list 允许list.add(1L);

正确答案是G。

【讨论】:

  • 您确定 G 是正确答案吗?我不这么认为
  • 然后尝试编译B
  • 你是对的。意味着OCJP的官方书籍也可以有错误:O
  • 他们给出的解释是,进程的返回类型肯定声明为 List ,而不是 ArrayList ,所以 A 和 D 是错误的。 C 是错误的,因为返回类型的计算结果为 List ,并且不能分配给 List 类型的变量。当然,所有这些都可能导致 NullPointerException,因为变量仍然为空——但问题只要求我们让代码编译
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2010-11-06
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2012-05-07
相关资源
最近更新 更多