This question already has answers here:
List<? extends MyType>
                                
                                    (5个答案)
                                
                        
                                3年前关闭。
            
                    
我有一个具有通用绑定类型的集合,定义如下:

Set<? extends BasicShape> shapes = new HashSet<>();


在我的实现中(为了这个问题),BasicShape不是抽象的。

我希望那时能够做到:

shapes.add(new BasicShape())


但我不能,编译失败:
java - 了解集合内的Java绑定(bind)通用类型-LMLPHP

I have verified,extends包含在内-这意味着它包括上限本身(在我的情况下为BasicShape)。

我在其他SO线程中找不到此特定问题的答案。

有人可以向我解释这种行为吗?

最佳答案

当您将shapes声明为

Set<? extends BasicShape> shapes = new HashSet<>();


这意味着您可以为该变量分配Set<BasicShape>Set<Rectangle>Set<Circle>等。

因此,您不能将任何BasicShape添加到shapes,因为(就编译器所知而言)您可能正在尝试将Circle添加到Set<Rectangle>

如果将声明更改为:

Set<BasicShape> shapes = new HashSet<>();


您可以将任何BasicShape实例添加到该Set

关于java - 了解集合内的Java绑定(bind)通用类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38552375/

10-09 00:28