【发布时间】:2022-01-04 17:21:14
【问题描述】:
假设我有以下两个类:
public class SomethingElse<A, B> {
public List<? extends Something<A, B>> getOneList() {
//doesn't matter
}
public List<? extends Something<A, B>> getAnotherList() {
//doesn't matter
}
}
public class Something<A, B> {
//doesn't matter
}
我想合并从getOneList() 和getAnotherList() 得到的结果:
SomethingElse<String, Integer> somethingElse = new SomethingElse<>();
List<? extends Something<String, Integer>> oneList = somethingElse.getOneList();
List<? extends Something<String, Integer>> anotherList = somethingElse.getAnotherList();
anotherList.forEach(e -> oneList.add(e)); //<-- DOESN'T COMPILE
但是,编译器抱怨在上面的 .add() 方法中,它期望 capture of ? extends Something<String, Integer> 但我提供...好吧,capture of ? extends Something<String, Integer>:
我觉得这与类型擦除有关,但我不知道为什么,甚至编译器本身也无法产生明确的消息,因为它告诉我我提供类型 X,但它期待类型 X。
谁能从技术上解释为什么编译器不喜欢这个?我可能会在同一个列表中做哪些错误的混合?
【问题讨论】:
-
tl;dr:
anotherList是生产者,oneList是消费者。 -
@Turing85 非常感谢,重复的问题完美地回答了我的问题(但它没有弹出,因为我从未搜索过 PECS 术语 :)
-
PECS:生产者扩展,消费者超级。