好吧,这是被禁止的,但让我指出原因:
让我们考虑一下:
FavoritesList<Person> l = new FavoritesList<Contact>();
有些操作是允许FavoritesList<Person>
但禁止的,FavoritesList<Contact>
即添加任何Person
违反合同的子类FavoritesList<Contact>
。
您可能正在寻找的是:
FavoritesList<? extends Person> wildcardedList = new FavoritesList<Contact>();
这意味着:这是一个未指定类型的列表?
,这个列表中的所有元素都是这个类型?
,我们知道这个类型?
是扩展人。请注意,这种类型的通配符起初可能不直观。基本上他们给你的是这个列表的只读视图。
让我们假设:
class FavoritesList<T>{
void add(T t){...}
}
基本上你不能打电话:
wildcardedList.add(new Contact());
也不:
wildcardedList.add(new Contact());
因为我们不知道是否Person
属于Contact
未指定类型 T。
为此,您必须将通配符添加到add
参数类型,然后它会变得混乱。