我写了简单的通用代码,遇到了奇怪的行为。我有这样的地图:
Map<FamilyMember<? extends Person>, List<Socks<? extends Person>>> socksInTheBox;
家庭成员是一个通用摘要,如下所示:
public abstract class FamilyMember<T extends Person> {
abstract void putSocksInTheBox(List<Socks<T>> socks);
abstract List<Socks<T>> takeSocksFromTheBox();
}
人只是没有方法的界面:
interface Person {
}
袜子是通用类:
public class Socks <Owner extends Person> {
Owner owner;
public Socks(Owner owner) {
this.owner = owner;
}
}
我想编写一种将<K, V>
添加到socksInTheBox
的方法:
public <T extends Person> void putSocks(FamilyMember<T> member, List<Socks<T>> socks) {
socksInTheBox.put(member, socks);
}
但这给了我socksInTheBox.put(member, socks);
is not applicable for the arguments (FamilyMember<T>, List<Socks<T>>)
当我将List<Socks<T>>
更改为List<Socks<? extends Person>>
时,它开始工作。谁能解释我为什么会这样?