Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LinkedList子列表是否返回列表而不是LinkedList?_Java_List_Oop_Types_Linked List - Fatal编程技术网

Java LinkedList子列表是否返回列表而不是LinkedList?

Java LinkedList子列表是否返回列表而不是LinkedList?,java,list,oop,types,linked-list,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

我有一个函数
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
中检查实现,它实际上在父类之一(
AbstractList
)中,您将看到它不会返回
LinkedList
而是
子列表,您的强制转换将抛出异常

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

public static <T> void g(List<T> l) {
公共静态无效g(列表l){

子列表
列表
界面中定义,并返回一个
列表
。如果您在
链接列表
中检查实现,它实际上位于父类之一(
抽象列表
),您将看到它不会返回一个
链接列表,而是返回一个
子列表,您的强制转换将抛出一个异常

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

public static <T> void g(List<T> l) {
公共静态无效g(列表l){
如果g()不使用LinkedList的方法,但只使用List接口,则最好按如下方式定义g():

public static <T> void g( List<T> l ) {
}
公共静态无效g(列表l){
}
主要是:

public static <T> void f() {
    List<T> l = new LinkedList<T>();
    ...
    List<T> l2 = l.subList(i,j);
    ...
    g(l2);
}
publicstaticvoidf(){
列表l=新的LinkedList();
...
列表l2=l.子列表(i,j);
...
g(l2);
}
为了说明理由,.

如果g()不使用LinkedList的方法,但最好只使用列表接口来定义g(),如下所示:

public static <T> void g( List<T> l ) {
}
公共静态无效g(列表l){
}
主要是:

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

作为一个理由,.

Java想要尽可能多的多态性,所以子列表返回列表,您必须将其转换为您想要的形式。

Java想要尽可能多的多态性,所以子列表返回列表,您必须将其转换为您想要的形式。

方法
子列表
列表中声明ace由
LinkedList
实现。
列表
界面中
子列表
方法的签名为:

 List<E> subList(int fromIndex, int toIndex)
列表子列表(int-fromIndex,int-toIndex)

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

方法
子列表
是dec>在由
LinkedList
实现的
列表
界面中显示。在
列表
界面中
子列表
方法的签名为:

 List<E> subList(int fromIndex, int toIndex)
列表子列表(int-fromIndex,int-toIndex)

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

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

希望能有帮助


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

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

希望能有帮助


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

编程到接口,而不是实现。编程到接口,而不是实现。说得好,mate..sublist()来自列表,而不是LinkedList不幸的是,
g
需要一个
LinkedList
。你可以随时调用
g(新LinkedList(sublist));
…说得好mate..sublist()是从列表而不是从LinkedList不幸的是,
g
需要一个
LinkedList
。您可以随时调用
g(新LinkedList(子列表));
…实际上,它返回一个
java.util.SubList
,因此您不能将其强制转换为您想要的任何内容!
java.lang.ClassCastException:java.util.SubList不能强制转换为java.util.LinkedList
实际上,它返回一个
java.util.SubList
,因此您不能将其强制转换为您想要的任何内容!
java.lang.ClassCastException:java.util.SubList不能转换为java.util.LinkedList