在标记之间声明的java的方法_在Java中使用通配符和在抽象方法中声明泛型类型之间的区别...

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&lt ;?的子类型扩展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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值