我读过O'Reilly的书,因为我开始了解这个获取原则.
extends仅从结构中获取值时使用通配符.super仅在将值放入结构时使用通配符.- 当你们想要从一个结构中获取和放置时,不要使用通配符.
例外情况是:
extends除了null属于每个引用类型的值之外,您不能将任何内容放入使用通配符声明的类型中.
super除了type的值之外,您不能从使用通配符声明的类型中获取任何内容Object,这是每种引用类型的超类型.
任何人都可以帮助我深入探索这条规则吗?如果可能的话,请将它们分层.
<T> List<? extends T> f()签名是否有用?它/使用它有什么问题吗?
这是一个面试问题.我知道这个:
List<? extends Number> lst = obj.<Number>f(),然后我只能在lst上调用那些在签名中不包含T的List方法(比如isEmpty(),size(),但不能添加(T),删除(T)这完全回答了这个问题吗?
具有以下简单的类结构:
class A {
}
class B extends A {
}
class C extends B {
}
Run Code Online (Sandbox Code Playgroud)
我正在创建一个ArrayList来保存先前创建的类的对象:
List<? extends A> list1 = new ArrayList<A>();
List<? extends B> list2 = new ArrayList<B>();
List<? extends C> list3 = new ArrayList<C>();
List<? super A> list4 = new ArrayList<A>();
List<? super B> list5 = new ArrayList<B>();
List<? super C> list6 = new ArrayList<C>();
Run Code Online (Sandbox Code Playgroud)
对于每个列表,我正在尝试添加每个先前创建的类的1个对象:A,B,C.唯一可能的组合是:
将类A,B,C的对象添加到list4
将类B和C的对象添加到list5
将类C的对象添加到列表list6.其余的尝试给出了编译器错误,例如:
类型List中的方法add(capture#1-of?extends A)不适用于参数(A)
为什么我不能将类A,B,C的任何对象添加到list1/2/3?为什么例如list4接受类A,B,C的对象,如果它们应该是A类的超类,因为list4是定义的?
为什么我用这个Java代码会出现编译器错误?
1 public List<? extends Foo> getFoos()
2 {
3 List<? extends Foo> foos = new ArrayList<? extends Foo>();
4 foos.add(new SubFoo());
5 return foos;
6 }Run Code Online (Sandbox Code Playgroud)
其中'SubFoo'是实现Foo的具体类,而Foo是一个接口.
我用这段代码得到的错误:
更新:感谢Jeff C,我可以更改第3行来说"new ArrayList <Foo>();".但我仍然遇到第4行的问题.
在尝试理解Spring MVC中的概念之后,我遇到了Collection<? extends Book>我以前从未见过的表达式.我试图自己搞清楚,但我发现使用Collection<? extends Book>和没有区别Collection<Book>.我猜它只允许Book的扩展,但它确实允许Book.抓那个.我曾尝试使用谷歌,但从那以后?是google中的通配符,它几乎不可能搜索.我已经搜索了stackoverflow以获得答案,但所有关于此问题的问题(例如List <?extends MyType>和<?extends> Java语法)已经知道了Collection<? extends T>.这段代码最初引起了我的兴趣:
import java.util.ArrayList;
import java.util.Collection;
public class Book {
public static void main(String[] args) {
BookCase bookCase1 = new BookCase();
BookCase bookCase2 = new BookCase(bookCase1);
}
}
class BookCase extends ArrayList<Book> {
public BookCase() {
}
//acts same as public BookCase(Collection<Book> c) {
public BookCase(Collection<? extends Book> c) {
super(c);
}
}
Run Code Online (Sandbox Code Playgroud)
怎么<? extends T> …