-1
class A {}

class B extends A{}

class C extends B{}

public class Test {
   public List<? extends B> ring(){
     return ???
   }
}

请告诉我,以下哪个可以是方法 ring() 的合法返回类型?

return new ArrayList<B>();
return new ArrayList<C>();
return new ArrayList<A>();
return new ArrayList<? extends B>();
return new LinkedList<B>();
return new PriorityQueue<B>();
return new ArrayList();
4

3 回答 3

1

您的函数正在返回List<? extends B>,因此请在下面找到您的有效选项:

  1. return new ArrayList<B>(); 有效:因为任何类都是它自己的子类和超类
  2. return new ArrayList<C>(); 有效:因为C正在扩展B
  3. return new ArrayList<A>(); 无效:因为A没有扩展B
  4. return new LinkedList<B>(); 有效:因为List是超类LinkedList
  5. return new PriorityQueue<B>(); 无效:因为 PriorityQueue不是列表。
  6. return new ArrayList(); 有效:带有警告。
于 2013-03-23T18:26:20.670 回答
0

你真的应该问“什么是有效的退货声明?” 大多数这些工作。没有的是:

  • 返回新的 ArrayList(); // ArrayList 是一个 List,但 A 没有扩展 B。
  • 返回新的 ArrayList(); // 你永远不能实例化通配符泛型。您可以声明一个,但您不能自己创建一个。
  • 返回新的优先队列();// PriorityQueue 不是列表。
于 2013-03-23T18:07:34.433 回答
0

由于您必须返回 B 的列表,因此允许使用第一个和第二个。

第三个不是,因为 A IS-A B 不是真的;A 不扩展 B。

第四个对我来说毫无意义。

第五个很好,因为 LinkedList IS-A List。

第六个不行,因为 PriorityQueue 没有实现 List。

第七个没问题,但编译器可能会警告你。它的类型安全性较低,这就是泛型的意义所在。

于 2013-03-23T18:08:04.320 回答