补充说:这是Java 1.7 - 正如其他人在1.8中指出的那样,它显然是固定的
Collection<Collection<String>> xx;
// Fails
xx = Collections.singleton( Collections.singleton( "hello" ) );
// Succeeds
xx = Collections.singleton( (Collection<String>)Collections.singleton( "hello" ) )
Collections.singleton
会返回Set<T>
Set<String>
Set<T> extends Collection<T>
编译器错误说Expected <Collection<Collection<String>> but found <Set<Set<String>>
但是根据1和2我认为应该满足。成功线上的演员似乎是多余的,为什么我需要提供它呢?
答案 0 :(得分:2)
Collection<Collection<String>>
与Collection<Set<String>>
不同(由Collections.singleton()
返回)。编译器不在没有显式强制转换的情况下自动转换它们(除了在Java 8上,这样运行正常)。我相信你正在寻找的是
Collection<? extends Collection<String>> xx;
这样就可以将xx
分配给任何Collection
,其元素被声明为Collection
的任何子类,包括Collection
本身。