函数如何在java中实现泛型

时间:2012-02-09 12:48:27

标签: java generics

我正准备OCJP。我在转储中找到了一个问题

import java.util.*;
 public class G1 {
 public void takeList(List<? extends String> list) {
   // insert code here
 }
}

在第6行独立插入的三个代码片段将被编译? (选择三项。)

 A. list.add("foo");
 B. Object o = list;
 C. String s = list.get(0);
 D. list = new ArrayList<String>();
 E. list = new ArrayList<Object>();

答案:B,C,D

我有一个查询,如果List<? extends String表示它与String类和String类的所有子类匹配。

有人可以证明这里显示的答案是正确的吗?

4 个答案:

答案 0 :(得分:4)

A不正确,因为您的列表可能是List<SomeStringSubClass>,因此向其添加字符串将无效。 (我知道String是最终的,但编译器在这里并不关心它。)

E不正确,因为List<Object>无法分配给List<? extends String>,因为List<Object>包含的对象不一定是String类型或String的子类。

其他三个都可以:

  • B没问题,因为除了基元之外的所有东西都是Java中的对象
  • C是正常的,因为List<? extends String>包含String的实例或String的子类的实例。而sublcass的实例也是超类的一个实例。
  • D没问题,因为ArrayList<String>List<String>,而List<String>也是List<? extends String>

答案 1 :(得分:1)

A. `list.add("foo");`

无法编译,因为您只能将null插入此列表

 B. Object o = list;

编译,因为列表是一个对象

C. String s = list.get(0);

编译,因为列表中的每个元素都保证是字符串对象或它的理论子类(实际上不可能,因为String是最终类,不能扩展)。

 D. list = new ArrayList<String>();

编译,因为列表中的每个元素都保证是一个字符串对象。

 E. list = new ArrayList<Object>();

不会编译,因为不是每个对象都是字符串

Keep in mind that String is a final class and cannot be extended.

答案 2 :(得分:0)

ListObject,因此B有效。

列表中存储的内容可以向上转换为字符串,因此C有效。

在泛型中,“<? extends String>”涵盖String的子类,其中没有字符串本身,因此D有效。

同样,“<? super String>”表示String或任何String's继承树,例如ObjectCharSequenceSerializable

答案 3 :(得分:0)

A不会编译,因为列表可能是扩展String的事物列表。泛型不会注意一个类是否是最终的。

一个更简单的例子是

public void takeList(List<? extends Number> list) {
   // insert code here
   list.add(1.0); // not allowed.
   Number n = list.get(0); // allowed.
}

// you could call it with
takeList(new List<BigInteger>());