所以我查看了一些Java代码并偶然发现:
List<? extends SomeObject> l;
Run Code Online (Sandbox Code Playgroud)
基本上这个列表接受SomeObject的某些对象 - SomeObject本身或其继承者.但是根据多态性,它的继承者也可以像SomeObject一样,所以这也可以:
List<SomeObject> l;
Run Code Online (Sandbox Code Playgroud)
那么,当第二个选项明确定义并且几乎相同时,为什么有人会使用第一个选项?
我有一个Java类,其中包含扩展MyClass的Objects子项.
class MyClass {
List<? extends MyClass> items;
[...]
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我无法将MyClass项插入此列表.我不明白为什么,以及如何绕过这个问题.例如:
void foo(){
items = new LinkedList<MyClass>(); // This is OK
items.add(new MyClass()); // Not allowed... why?
}
Run Code Online (Sandbox Code Playgroud)
编译器说" 类型List中的方法add(capture#1-of?extends MyClass)不适用于参数(MyClass)"
我真的不明白如何绕过这个问题,以及为什么编译器应该只接受一个必须扩展MyClass的类型.
注意:为什么我需要使用这种方法?因为我需要允许MyClass的扩展包含子项列表.
整数扩展数字,为什么我在底部得到错误?
interface Predicate<T> {
public abstract boolean check(T t);
}
Predicate<? extends Number> predUpper = null;
predUpper.check(new Integer(73));
Run Code Online (Sandbox Code Playgroud)
错误:谓词类型中的方法检查(捕获#6-of?extends Number)不适用于参数(整数)
我读过:类型Map <String中的方法,捕获#1-of?extends Object>不适用和<?超级T>和<?在Java中扩展T>