Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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 为什么这个使用泛型的构造函数失败了?_Java_Generics_Constructor_Generic List_Generic Programming - Fatal编程技术网

Java 为什么这个使用泛型的构造函数失败了?

Java 为什么这个使用泛型的构造函数失败了?,java,generics,constructor,generic-list,generic-programming,Java,Generics,Constructor,Generic List,Generic Programming,我正在创建一个类,该类目前在名为genericTable的内部对象中存储各种类型的列表。每个列表(由Double或Long组成)都保存在一个对象中,该对象是类genericslist的实例 问题:为什么方法addVector不起作用? 红色下划线下的错误表示构造函数测试。GenericList(List)未定义 如果我在一个main方法中工作(但是拥有相同的GenericList类),并且在main方法中创建了genericTable(使用List>;),并且添加了genericTable.ad

我正在创建一个类,该类目前在名为
genericTable
的内部对象中存储各种类型的列表。每个列表(由
Double
Long
组成)都保存在一个对象中,该对象是类
genericslist
的实例

问题:为什么方法
addVector
不起作用?

红色下划线下的错误表示
构造函数测试。GenericList(List)未定义

如果我在一个
main
方法中工作(但是拥有相同的
GenericList
类),并且在main方法中创建了
genericTable
(使用
List>;
),并且添加了
genericTable.add(新的GenericList(Arrays.asList(genericVector))
(在本例中,
genericVector
是一个
列表),它可以完美地工作

public class Test<V> {

    private final List<GenericList<?>> genericTable = new ArrayList<GenericList<?>>();

    public void addVector(List<V> genericVector) {
        genericTable.add(new GenericList<V>(Arrays.asList(genericVector)));
    }

    private class GenericList<K> {
        private final List<K> listGeneric;    

        public GenericList(List<K> input) {
           listGeneric = input;
        }
    }
}
公共类测试{
私人最终名单>();
public void addVector(列表genericVector){
add(新的GenericList(Arrays.asList(genericVector));
}
私有类泛型列表{
私人最终名单;
公共通用列表(列表输入){
listGeneric=输入;
}
}
}

当您已经拥有一个列表时,您不必要地使用了Arrays.asList()。因此,您将得到一个列表列表,这不是构造函数所接受的

请参阅javadocs:

此方法还提供了创建固定大小列表的方便方法 初始化为包含多个元素:

 List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
List stooges=Arrays.asList(“Larry”、“Moe”、“Curly”);
所以在你的例子中,你得到的是一个列表,而不是一个字符串列表

为了清晰起见,我在评论中添加了以下内容:

asList()的方法签名如下所示:-

public static <T> List<T> asList(T... a)
公共静态列表asList(T…a)
所以因为。。。a是一个vararg,当您传入“Larry”、“Moe”、“Curly”时,编译后的方法实际上接收一个
[“Larry”、“Moe”、“Curly”]
数组,并将它们作为列表返回


因此,由于您传入的是一个列表,而不是数组,因此该方法采用vararg数组,如下所示:[genericVector],并将该数组作为列表返回,您的构造函数将中断。

当您已经有一个列表时,您不必要使用Arrays.asList()。因此,您将得到一个列表列表,这不是构造函数所接受的

请参阅javadocs:

此方法还提供了创建固定大小列表的方便方法 初始化为包含多个元素:

 List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
List stooges=Arrays.asList(“Larry”、“Moe”、“Curly”);
所以在你的例子中,你得到的是一个列表,而不是一个字符串列表

为了清晰起见,我在评论中添加了以下内容:

asList()的方法签名如下所示:-

public static <T> List<T> asList(T... a)
公共静态列表asList(T…a)
所以因为。。。a是一个vararg,当您传入“Larry”、“Moe”、“Curly”时,编译后的方法实际上接收一个
[“Larry”、“Moe”、“Curly”]
数组,并将它们作为列表返回


因此,由于您传入的是一个列表,而不是一个数组,因此该方法采用vararg数组,如下所示:[genericVector],并将该数组作为列表返回,您的构造函数将中断。

请使用Java命名约定。当所有内容都以大写字母开头时,很难确定什么是
,什么是变量。请使用Java命名约定。当所有内容都以大写字母开头时,很难确定什么是
类,什么是变量。因此,如果我只是将可疑方法更改为
genericTable.add(new GenericList(genericVector))?这似乎是可行的。@user2763361我无法运行您的全部代码,但那一行肯定是错误的,并且是您所问的错误的原因。您的构造函数需要一个列表,而您已经有了一个列表,所以您只需将该列表喷射进来就可以了,而不必使用Arrays.asList()。@user2763361通常使用Arrays.asList()将数组转换为列表。正如我发布的代码片段所示,您还可以使用它从单个对象序列中获取列表。@user2763361抱歉。。。忘记添加:我提到的第二个用法是有效的,因为在方法调用中使用的vararg实际上是由一个隐藏的数组表示的。asList(“拉里”、“莫”、“卷曲”);与字符串[]anArray={“larry”、“Moe”、“Curly”}相同;Arrays.asList(anArray);因此,如果我只是将可疑方法更改为
genericTable.add(newgenericslist(genericVector)),一切都很好?这似乎是可行的。@user2763361我无法运行您的全部代码,但那一行肯定是错误的,并且是您所问的错误的原因。您的构造函数需要一个列表,而您已经有了一个列表,所以您只需将该列表喷射进来就可以了,而不必使用Arrays.asList()。@user2763361通常使用Arrays.asList()将数组转换为列表。正如我发布的代码片段所示,您还可以使用它从单个对象序列中获取列表。@user2763361抱歉。。。忘记添加:我提到的第二个用法是有效的,因为在方法调用中使用的vararg实际上是由一个隐藏的数组表示的。asList(“拉里”、“莫”、“卷曲”);与字符串[]anArray={“larry”、“Moe”、“Curly”}相同;Arrays.asList(anArray);