This question already has answers here:
How can I add to List<? extends Number> data structures?

(6 个回答)


4年前关闭。




我无法理解这里出了什么问题
import java.util.*;

class Main {
    private static class SomeX {}

    void doSomethingWithX(SomeX someX) {
        Collection<? extends SomeX> colectionOfX = new ArrayList<>();
        colectionOfX.add(someX);
    }
}
javac 说明如下:



据我了解 extends 将 CAP#1 的下限限制为 SomeX 并且 SomeX 本身应该满足该限制。

怎么了? (用 javac 1.8.0_102 编译)

最佳答案

如果要允许 colectionOfX 包含 SomeX 的任何实例,则应将其声明为:

Collection<SomeX> colectionOfX = new ArrayList<>();

当您将其声明为
Collection<? extends SomeX> colectionOfX = ...;

这意味着您可以为它分配任何包含 CollectionSomeX 子类的某种类型元素的 SomeX

例如,您可以为其分配一个 List<SomeBX> ,其中 SomeBX 扩展 SomeX 。在这种情况下,只能将 SomeBX 的实例添加到集合中。
因此,如果您尝试将一个 SomeX 实例添加到集合中,该实例不是 SomeBX (例如, SomeAX 的实例,它也是 SomeX 的子类),它将是无效的。

关于java - 不兼容的类型 : SomeX cannot be converted to CAP#1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39684999/

10-10 09:26