Java:泛型和通配符的区别
一开始我学习通配符的时候,我觉得这个和泛型T不都一样吗?都是表示未确定的类型,有何区别
举一个下面的例子:
@Test
public void demo1(){
List<Object> list = null;
List<String> listString = new ArrayList<>();
List<Double> listDouble = new ArrayList<>();
list = listString; //编译报错
list = listDouble; //编译报错
}
虽然String,Double是Object的子类,但是List< String> 和 List< Double> 可不是 List< Object>的子类,因此编译失败;如果你改成下面这样也是编译失败:
@Test
public void demo1(){
List<T> list = null;
List<String> listString = new ArrayList<>();
List<Double> listDouble = new ArrayList<>();
list = listString; //编译报错
list = listDouble; //编译报错
}
编译器会认为是有个类名字就叫T,所以也报错。但改成通配符就不会了,如下:
@Test
public void demo1(){
List<?> list = null;
List<String> listString = new ArrayList<>();
List<Double> listDouble = new ArrayList<>();
list = listString; //编译正常
list = listDouble; //编译正常
}
举例二:
public class Demo01<T> {
@Test
public void demo1(){
List<String> listString = new ArrayList<>();
List<Double> listDouble = new ArrayList<>();
demo2(listString); //编译报错
demo2(listDouble); //编译报错
}
public void demo2(List<T> list){
}
}
泛型的确定是由类最先确定,接着才能定下方法的。如果你这样通过方法来确定是会报错的;但改成通配符就没事了:
public void demo2(List<?> list){
}
举例三:
这个是通配符比泛型突出不同的一点,泛型可以是任何类型不加限制,而通配符可限制类型,如下:
public static void getElement1(Collection<? extends Number> coll){}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2020-11-21 mysql_基础案例2
2020-11-21 mysql_基础案例2
2020-11-21 mysql_子查询经典案例
2020-11-21 小白懂算法之基数排序