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