获取原则的解释

2022-08-31 11:44:47

我读过O'Reilly的书,因为我了解了这个get-put原则

  • 仅当仅从结构中获取值时请使用扩展通配符。
  • 将值放入结构中时,请使用超级通配符。
  • 当你们都想从/到一个结构时,不要使用通配符。

例外情况包括:

  • 不能将任何内容放入使用扩展通配符声明的类型中,但值 null 除外,该值属于每个引用类型。

  • 除了 Object 类型的值(它是每个引用类型的超类型)之外,您无法从使用超级通配符声明的类型中获取任何内容。

任何人都可以帮我深入探索这个规则吗?如果可能的话,请把它们分层。


答案 1

考虑一堆香蕉。这是一个因为它是一种特定种类的水果的集合 - 但你不知道(从那个声明中)它是一种什么样的水果的集合。你可以从中得到一个项目,并知道它肯定会是一种水果,但你不能添加它 - 你可能试图在一堆香蕉上添加一个苹果,这肯定是错误的。您可以添加它,因为这将是任何种类水果的有效值。Collection<? extends Fruit>null

现在考虑一个果碗。这是一个 ,因为它是某种类型“大于”的集合(例如,或 )。你绝对可以添加一根香蕉,但是如果你从碗里拿一件东西,你不知道你会得到什么 - 它很可能不是香蕉。您唯一可以肯定的是,它将是一个有效的(可能)参考。Collection<? super Banana>BananaCollection<Fruit>Collection<TropicalFruit>nullObject

(一般来说,对于Java泛型问题,Java泛型常见问题解答是一个很好的资源,它包含了几乎所有你可能抛出的与泛型相关的问题的答案。


答案 2

推荐