Kye*_*JmD 1 java generics wildcard super
这段代码
static void writeTo(List<? super Apple> apples) {
apples.add(new Apple());
apples.add(new Jonathan());
}
Run Code Online (Sandbox Code Playgroud)
该代码的作者说明了这一点
参数apples是某种类型的List,它是Apple的基本类型; 因此,您知道添加Apple或Apple的子类型是安全的.由于下限是Apple,
Jonathan是Apple的子类.
但是当我尝试这个时
List<Jonathan> loj = new ArrayList<Jonathan>();
listSuper(loj);
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误
The method listSuper(List<? super Apple>) in the type Basket<T> is not applicable for the arguments (List<Jonathan>)
Run Code Online (Sandbox Code Playgroud)
哪里listSuper是这样的
static void listSuper (List<? super Apple> cont) {}
Run Code Online (Sandbox Code Playgroud)
这两者有何不同?
还有什么让我对我发布的第一个代码感到困惑的是我想到的?super T意味着任何基本类型的T.但是从它的外观上他添加了T的子类型.我很困惑.
List<? super Apple>意味着List你可以添加一个Apple(并且因为Jonathan 是 Apple,你也可以将Jonathans加入到List该类型中).
它可以是List<Apple>,List<Fruit>或者List<Object>,但不是List<Jonathan>,因为你不能把任意Apples List<Jonathan>.如您所见,在这种情况下?可以是一个Apple或任何超类.
List<? extends Apple>意味着List你可以得到一个Apple.它可以是List<Apple>或List<Jonathan>,但不能List<Fruit>,因为List<Fruit>不能保证只包含Apple秒.
这种解释被称为"生产者 - extends,消费者 - super"规则:如果参数充当元素的消费者,则应该声明它super,反之亦然.
| 归档时间: |
|
| 查看次数: |
395 次 |
| 最近记录: |