java中的List,List,与List奇怪的问题

你的选择H 2021-05-19 10:38:06

//第一种情况show形参为List,能编译通过,而且show中list.add("2s")也没提示错误
show(list2);
show(list3);

public static void show(List list) {
list.add("2s"); //这里没报错
System.out.println(list.get(0));
}



//第二种情况show形参为List<Object>,编译通不过
show(list2); //这里会报错
show(list3); //这里会报错

public static void show(List<Object> list) {
list.add("2s");
System.out.println(list.get(0));
}



//第三种情况show形参为List<?>,编译通不过,show中list.add("2s")报错
show(list2);
show(list3);

public static void show(List<?> list) {
list.add("2s"); //这会报错
System.out.println(list.get(0));
}

各位看官,都来解释解释上面三种情况到底怎么回事
...全文
376 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2021-05-20
  • 打赏
  • 举报
回复 1
第一种情况形参没设置泛型,那就表示实参只要是List类型,都符合形参。而且没有泛型,就会默认为Object类型,所以add(“2s”)没问题 第二种情况设置了泛型为确定类型<Object>,那就要求实参的泛型也必须是确定类型<Object>,即list2和list3也必须是List<Object>。注意,虽然String是Object的子类,但是List<String>和List<Object>不是同一类型。然而对于元素来讲,”2s”也属于Object,所以add(“2s”)没问题。打个比方,猫是动物,形参是List<动物>,实参就不能是List<猫>,人家明明是要你传入一个可以放动物的容器,你却传入只能放猫的容器,能行吗?但是,放动物的容器能放猫吗?显然能,所以add(“2s”)也没问题。 第三种是设置了泛型为未确定类型,这就表示实参是任意泛型都可以。然而,”2s”却是确定的String类型,一个未确定类型的容器,怎么能放一个确定类型的元素?你怎么就能主观的认为这个未确定的类型就是String,有可能人家是Interge类型的容器呢,所以,add(“2s”)就有问题。
Little BigUs 2021-05-20
  • 打赏
  • 举报
回复
第一种没有设置泛型,String类型自然能写入和读出。第二种情况也不会报错,前提是你的参数传对了,List<Object> list2 = new ArrayList<>(); 第三种情况, List和List<?>区别 后者一般用于只读模式 List<?>因为不知道里面元素的类型,所以不能执行add方法,除非是null

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧