2014-11-22 70 views
0

如果我有以下代码:从Java的泛型类中的嵌套泛型中分配一个变量?

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<?>>

+0

我认为你的问题已经在这里找到答案: http://stackoverflow.com/questions/13056421/mixing-nested-type-parameters-and-wildcards-in-java – 2014-11-22 08:03:34

回答

-1

首先重要的是要知道,那编译器替换运营商与对象类。所以,当你写:

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

但是你可以做如下:

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

看到优秀的文章Generics gotchas