Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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 - Fatal编程技术网

在Java中将具有通配符泛型的集合传输到列表

在Java中将具有通配符泛型的集合传输到列表,java,generics,Java,Generics,我有一个数据类型,其中包含一个集合和一个方法,该方法需要List是否可以: List<MyClass> newData = new ArrayList<MyClass>(data); setData(newData); List newData=newarraylist(数据); setData(newData); ? 甚至一行: setData(new ArrayList<MyClass>(data)); setData(新的ArrayList(dat

我有一个数据类型,其中包含一个集合和一个方法,该方法需要
List是否可以:

List<MyClass> newData = new ArrayList<MyClass>(data);
setData(newData);
List newData=newarraylist(数据);
setData(newData);
?

甚至一行:

setData(new ArrayList<MyClass>(data));
setData(新的ArrayList(data));

您不能用
MyClass
实例化它,因为
newData
不一定是
List
类型,Java不支持协方差(即,
S
扩展
t
并不意味着
ArrayList
ArrayList
的子类型)

你能做的是:

List newData=newarraylist()

现在,
集合
(保证是
MyClass
的子类型)中的所有内容都可以放入
newData


一般来说,通配符类型强制执行边界约束。你知道,
Set我知道我对写作的掌握是不稳定的,但这似乎是可行的:

public <T extends MyClass> void setData(Set<T extends MyClass> data) {
    setData(new ArrayList<T>(data));
}
public void setData(集合数据){
setData(新ArrayList(数据));
}

即使它能工作,你也会得到无穷大的递归。@Roman:这是怎么回事<代码>列表
不是
集合
的子类,反之亦然around@Roman还有另一个带有签名的方法:setData(ListClose:publicsetdata(Set-data)。但是,获取列表的setData也必须在签名中具有相同类型的泛型。我发现另一个可行的方法是,简单地让所讨论的类将T作为类参数。在这个例子中,虽然它需要比我喜欢的更多的重构,但还是可行的。尽管这样更好。重构更少。更好的理由是不这样做的原因是(可能)这个方法不应该被参数化。这取决于你是想
setData
对所有
Set
进行操作,还是只想
MyClass
Set
及其子类型进行操作。好吧,我总是可以参数化这个类,使它只接受扩展MyClass的类型(T扩展MyClass)。
public <T extends MyClass> void setData(Set<T extends MyClass> data) {
    setData(new ArrayList<T>(data));
}