gpt4 book ai didi

java - 为什么 Java 将此报告为类型不匹配?

转载 作者:行者123 更新时间:2023-12-04 03:43:41 25 4
gpt4 key购买 nike

我已经知道 Iterator包含扩展 ZipEntry 的对象集合但我无法在没有错误的情况下执行此沮丧:

ZipFile zf = new ZipFile("a.zip");

// Type mismatch: cannot convert from Iterator<capture#4-of ? extends ZipEntry> to Iterator<ZipEntry>
Iterator<ZipEntry> it = zf.entries().asIterator();

向下转换在 Java 中不是错误:

String a = "";

// Works fine
Object b = a;

确切的返回类型是Iterator<? extends ZipEntry>但我不需要原始类型,因为我只使用 ZipEntry 提供的行为.

如果我施放它,我仍然会收到警告:

// Type safety: Unchecked cast from Iterator<capture#4-of ? extends ZipEntry> to Iterator<ZipEntry>
Iterator<ZipEntry> it = (Iterator<ZipEntry>)zf.entries().asIterator();

如果我已经知道 ? extends ZipEntry,这里未经检查的转换有什么问题? ?为什么这会不安全?

最佳答案

Iterator<? extends ZipEntry>表示未知类型的迭代器。关于该类型,我们唯一知道的是它是 ZipEntryZipEntry 的子类型.换句话说,它可能是 Iterator<ZipEntry> , Iterator<JarEntry> , 或 Iterator<SomeOtherSubclass>实际上。

因此,您无法确定 Iterator<? extends ZipEntry>可以分配给类型为 Iterator<ZipEntry> 的变量.当然,如果它是 Iterator<ZipEntry> , 然后你可以分配它,但它也可以是 Iterator<JarEntry> , 或 Iterator<SomeOtherSubclass> ,在这种情况下你不能。 Foo<T>Foo<U>是不相关的类型,即使 TU 的子类.读一读为什么这对 List<T> 是正确的和 List<U> .

不过在这种情况下,这个论点(来自链接的帖子):

// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new ArrayList<Dog>(); // ArrayList implements List
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?

不适用于 Iterator s,因为你只能从迭代器中取出东西,而不能添加东西。事实上,你可以在迭代器上做的所有操作都是安全的,即使你被允许 Iterator<Animal> animals = dogs; .但是,编译器根本不会自动检查所有操作是否安全。

Java 的工作方式是,当您使用 泛型类型时,您可以说“请让我将 Iterator<JarEntry> 分配给 Iterator<ZipEntry>,并且不允许我使用任何不安全的操作”。这样做的语法是:

Iterator<? extends ZipEntry> it = zf.entries().asIterator();

(这叫做 use-site variance 。)

“不允许我使用任何不安全的操作”类型与 asIterator 的返回类型完全相同并非巧合。 .

Iterator没有任何此类不安全操作,您将获得与常规 Iterator<ZipEntry> 完全相同的界面.

将此与在 List 上使用时进行比较.你将无法 add任何List<? extends ZipEntry> ,例如。

关于java - 为什么 Java 将此报告为类型不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65520245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com