gpt4 book ai didi

Java通配符通用问题: Compiler assumes different types for same object

转载 作者:行者123 更新时间:2023-12-01 19:14:20 26 4
gpt4 key购买 nike

我有一个与 JAVA 通配符和泛型相关的问题。我不想发布自己的复杂代码,所以我将使用 Collection 接口(interface)进行演示:

Collection<String> stringCollection = new HashSet<String>();
stringCollection.add("1");
stringCollection.add("2");
stringCollection.add(stringCollection.iterator().next());

这里,最后一行是没有问题的。 add() 需要一个字符串,next() 返回一个字符串。

但是:

Collection<?> anyCollection = stringCollection;
anyCollection.add(anyCollection.iterator().next());

使用通配符,Eclipse 告诉我错误

The method add(capture#19-of ?) in the type Collection is not applicable for the arguments (capture#20-of ?)

但是为什么呢?我需要使用通配符集合。不知何故,Eclipse 就是不明白 next() 绝对必须返回 add() 所需类型的对象。

有什么办法可以解决这个问题而不出现错误吗?当然,转换为 (capture#20-of ?) 不起作用。

最佳答案

除了 null 之外,您不能添加任何内容到 Collection<?> 。是的,您知道集合中已有的任何元素都应该能够添加到集合中,但类型并不反射(reflect)这一点。 <?><? extends Foo>仅当您只需要从集合中检索对象而不添加到集合中时才应使用。您能否说明为什么需要使用通配符而不是 Collection<E>

(我假设您知道这一点,但在您的示例中,您的集合是 Set,因此,添加其中已有的任何元素将不会执行任何操作。)

编辑:

从你的评论来看,我觉得你不需要通配符,而只是一个通用方法:

public <T extends PersistenceObject> void doSomething(Dao<T> dao) {
T o = dao.createNew();
// ...
dao.save(o);
}

对于想要重新添加 Collection 的第一个元素的方法也是如此。给它:

public <E> boolean reAddFirst(Collection<E> collection) {
return collection.add(collection.iterator().next());
}

特定类型参数(而不是通配符)告诉编译器从对象检索的类型与对象期望传递给其方法的类型相同。

关于Java通配符通用问题: Compiler assumes different types for same object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7378905/

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