上限有限的通配符,迭代器和for-each循环

use*_*030 4 java generics casting

我不明白为什么这段代码编译:

public void test(Collection<? extends Enum> enumCollection) {
    for (Enum e : enumCollection) {
    }
}
Run Code Online (Sandbox Code Playgroud)

这个不是:

public void test(Collection<? extends Enum> enumCollection) {
    Iterator<Enum> iterator = enumCollection.iterator();
    //Required: Iterator<Java.lang.Enum>
    //Found: Iterator<capture<? extends Java.lang.Enum>>
}
Run Code Online (Sandbox Code Playgroud)

? extends Enum应该是Enum所有情况下的子类型,那么为什么我会在迭代器中遇到编译错误,为什么它与for-each循环一起工作?

Old*_*eon 8

如果你需要使用,我经常会发现这句格言在你的通用中,你可能做错了什么.

这很好用:

public <T extends Enum<T>> void test(Collection<T> enumCollection) {
    for (Enum e : enumCollection) {
    }
    Iterator<T> iterator = enumCollection.iterator();
}
Run Code Online (Sandbox Code Playgroud)

你的问题是你期望泛型行为像普通代码一样,ArrayList也是一个List.它不是为此而设计的.泛型是为了确保您使用相同类型,而不仅仅是一些兼容类型.

在你的情况下 - 匹配? extends Enum你可以使用:

    Iterator<?> iterator = enumCollection.iterator();
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.

你的类型不匹配 - 并且通用的东西确保他们这样做.

请记住,?这并不意味着我不关心它是什么类型它意味着我不想知道它是什么类型.?在泛型类型中使用然后期望能够使用该类型是愚蠢的.