LinkedList子列表返回List而不是LinkedList?

时间:2013-04-17 18:56:31

标签: java list oop types linked-list

我有一个函数f,它获取LinkedList的子列表并将其传递给g,这也需要LinkedList

public static <T> void g(LinkedList<T> l) {
}

public static <T> void f() {
    LinkedList<T> l = new LinkedList<T>();
    ...
    LinkedList<T> l2 = l.subList(i,j);
    ...
    g(l2);
}

但是这不会编译,因为显然LinkedList.subList会返回List而不是LinkedList。所以我必须改为:

LinkedList<T> l2 = (LinkedList<T>)l.subList(i,j);

为什么?

5 个答案:

答案 0 :(得分:5)

subListList界面中定义,并返回List。如果您检查LinkedList中实际位于其中一个父类(AbstractList)中的实现,您会看到它返回{{1}但是LinkedList并且你的演员会抛出异常。

除非您使用特定于SubList的方法,否则解决此问题的最简单方法是将LinkedList更改为:

g

答案 1 :(得分:0)

如果g()不使用LinkedList的方法,但只有List接口更适合定义g(),如下所示:

public static <T> void g( List<T> l ) {
}

主要成为:

public static <T> void f() {
    List<T> l = new LinkedList<T>();
    ...
    List<T> l2 = l.subList(i,j);
    ...
    g(l2);
}

为了证明理由,please consult this post

答案 2 :(得分:0)

方法sublistList接口中声明,由LinkedList实现。 sublist接口中List方法的签名是:

 List<E> subList(int fromIndex, int toIndex)

因此,每当您从LinkedList类调用此方法时,该对象将为LinkedList,但该方法的返回类型为List,因此它将以表单形式给出List。但是,您可以将变量强制转换为LinkedList并使用它。

答案 3 :(得分:0)

您无法实例化对象&#39;这样的清单。 List是一个接口,而不是具体的类。 接口只是一个类可以实现的一组函数;实例化一个接口没有任何意义。

希望它有所帮助。

Clemencio Morales Lucas。

答案 4 :(得分:-1)

Java需要尽可能多的多态性,因此subList返回List,你必须将它转换为你想要的。