没有显式强制转换的通用集合编译错误 - 为什么?

时间:2014-08-29 19:35:44

标签: java

补充说:这是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" ) )
    在这种情况下,
  1. Collections.singleton会返回Set<T> Set<String>
  2. Set<T> extends Collection<T>
  3. 编译器错误说Expected <Collection<Collection<String>> but found <Set<Set<String>>但是根据1和2我认为应该满足。成功线上的演员似乎是多余的,为什么我需要提供它呢?

1 个答案:

答案 0 :(得分:2)

Collection<Collection<String>>Collection<Set<String>>不同(由Collections.singleton()返回)。编译器在没有显式强制转换的情况下自动转换它们(除了在Java 8上,这样运行正常)。我相信你正在寻找的是

Collection<? extends Collection<String>> xx;

这样就可以将xx分配给任何Collection,其元素被声明为Collection的任何子类,包括Collection本身。