First case
只需声明您的方法:
@Override
protected List getMagicables() {
List list = ...
return list
}
如果你真的想要这个:
@Override
protected List getMagicable() {..}
您可能必须将通用T声明为类定义
public abstract class AbstractKlass {
protected abstract List getMagicables();
}
然后在你的子类中:
public class MySubClass extends AbstractKlass {
@Override
protected List getMagicables() {
...
}
}
Second case
编译错误是正常的,因为从方法的签名意味着你不关心列表中的内容,从你可以将这些元素视为可魔术的那一刻起.在打电话时
List list = getMagicables();
你想在不知情的情况下照顾T型.换句话说,有3个用例:T是Magicable(OK),T是魔术师(错误因为getMagicables可能返回Witch列表)而T是Witch(也错了).
Why I use ? extends Magicable instead of just Magicable in lists
因为List< Magician>是List< ;?的子类型扩展Magicable>但不是List< Magicable>的子类型.这对于方法的参数是有用的.
public void doIt(List extends Magicable> list) {
// you can't add a Magician here
}
可以用作
List list = ...
doIt(list);
但如果你有
public void doIt(List list) {
// you can add a Magician here
}
你不能用它
List list = ...
doIt(list); // compile error