泛型通配符extends和super的区别

本文详细解析了Java泛型中的<? extends T>和<? super T>的使用场景及限制,通过实例说明了它们在方法入参和返参中的应用,以及如何避免类型检查错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.<?extends T>只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是入参类型无法确定,只能接受null的传人
2.<?super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接受
3.?既不能用于入参也不能用于返参
代码这里写代码片


class Super{ }
class Self extends Super{ } class Son extends Self{ }
void test(){
List<?extends Self> a=new ArrayList<>(); //参数类型上界是Self
a.add(new Son()); //error不能放入任何类型,因为编译器只知道a中应该放 入Self的某个子类,但具体放哪种子类他并不知道,因此除了null以外,不能放入任何类型
a.add(new Self()); //error
a.add(new super()); //error
a.add(null); //error
Self s1=a.get(0); //返回类型是确定的Self类,因为<? extends T>只能用于方法返,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是参数无法确定,只能接受null的传人
Super s2=a.get(0); //Self类型可以用Super接收
Son s3=a.get(0); //error

 //----------   
 List<?super Self> b=new ArrayList<>();  //参数类型下界是Self
 b.add(new Son());  //ok只能放入T类型,且满足T类的超类至少是Self,换句话说,就是只能放入Self的子类型
 b.add(new Self());  //ok本身类型也可以
 b.add(new Super());  //ok超类不可以
 b.ass(null);        //ok
 Object o1=b.get(0);  //返回类型是未知的, 因为<? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收
 Son o2 = b.get(0);//error
 Self o3 = b.get(0);//error
 Super o4 = b.get(0);//error
List<?> c=new ArrayList<>();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值