在Java中的泛型类中为嵌套泛型赋值?

时间:2014-11-22 07:52:18

标签: java generics nested-generics

如果我有以下代码:

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()分配给Set<List<?>>

2 个答案:

答案 0 :(得分:1)

但是你可以这样做:

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

请参阅优秀文章Generics gotchas

答案 1 :(得分:-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>>();