0

如果我有以下代码:

public class DummyClass<T> {
    public List<T> getList() {
        return new ArrayList<T>();
    }
    public Set<List<T>> getListSet() {
        return new HashSet<List<T>>();
    }
}

我有一个DummyClass<?> dummy

我可以

List<?> list = dummy.getList();

没有任何错误。

然而,

Set<List<?>> listSet = dummy.getListSet();

给出编译错误:

Type mismatch: cannot convert from Set<List<capture#1-of ?>> to Set<List<?>>

为线分配dummy.getListSet()

为什么我不能分配dummy.getListSet()给 a Set<List<?>>

4

2 回答 2

1

但是,您可以执行以下操作:

Set<? extends List<?>> listSet = listSet = dummyClass.getListSet();

请参阅出色的文章Generics gotchas

于 2014-11-22T09:52:11.063 回答
-1

首先重要的是要知道,编译器替换? 具有Object类的运算符。所以当你写这个时:

DummyClass<?> dummy

您的类定义将如下所示:

public class DummyClass<Object>

和这样的方法:

public List<Object> getList() {
    return new ArrayList<Object>();
}
public Set<List<Object>> getListSet() {
    return new HashSet<List<Object>>();
}

你可以写

List<?> list = new List<Object>();

但不是

Set<List<?>> set = new HashSet<List<Object>>();
于 2014-11-22T08:58:03.280 回答