以下方法的返回类型应该是什么?

时间:2013-03-23 17:58:13

标签: java generics wildcard

class A {}

class B extends A{}

class C extends B{}

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

请告诉我,以下哪个方法可以合法返回方式环()?

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();

3 个答案:

答案 0 :(得分: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>(); 有效:因为ListLinkedList的超级
  5. return new PriorityQueue<B>(); 无效,因为PriorityQueue不是列表。
  6. return new ArrayList(); 有效:并发出警告。

答案 1 :(得分:0)

你应该问“什么是有效的退货声明?”其中大部分都有效。那些没有的是:

  • 返回new ArrayList(); // ArrayList是List,但A不扩展B.
  • 返回new ArrayList(); //你永远不能实例化通配符。你可以声明一个,但不要自己创建一个。
  • 返回新的PriorityQueue(); // PriorityQueue不是List。

答案 2 :(得分:0)

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

第三个不是,因为A IS-A B不是真的; A不会延长B.

第四个对我没有意义。

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

第六个不起作用,因为PriorityQueue没有实现List。

第七个没关系,但编译器可能会警告你。它的类型安全性较低,这就是泛型。