LinkedList 子列表返回 List 而不是 LinkedList



我有一个函数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);

为什么?

subListList 接口中定义并返回一个 List 。如果你检查 LinkedList 中的实现,它实际上是在父类之一 ( AbstractList (,你会看到它返回LinkedList而是返回SubList,并且你的强制转换将抛出异常。

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

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

如果 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);
}

有关理由,请参阅此帖子。

方法sublist在由LinkedList实现的List接口中声明。List 接口中 sublist 方法的签名为:

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

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

您不能实例化"对象"这样的列表。List 是一个接口,而不是一个具体的类。接口只是一个类可以实现的一组函数;实例化接口没有任何意义。

希望对您有所帮助。

克莱门西奥·莫拉莱斯·卢卡斯。

Java 想要尽可能多的多态性,所以 subList 返回 List,你必须把它转换为你想要的。

相关内容

  • 没有找到相关文章

最新更新