前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么说 Java 的泛型是伪泛型?

为什么说 Java 的泛型是伪泛型?

作者头像
水货程序员
修改2018-12-03 16:24:12
2.6K0
修改2018-12-03 16:24:12
举报
文章被收录于专栏:javathingsjavathings

为什么说 Java 的泛型是伪泛型?

Java 的泛型是伪泛型, 也就是骗骗编译器的。运行期的泛型类型,被擦除了,因此,在运行期,ArrayList<String> 和 ArrayList<int> 是相同的类型。

要证明是伪泛型,非常简单。看下面代码:

代码语言:javascript
复制
List<Integer> li = new ArrayList<Integer>();
List<Float> lf = new ArrayList<Float>();
boolean issame = li.getClass() == lf.getClass();
System.out.println(issame);//true

伪泛型会导致一些陷阱:

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
 
		List list = new ArrayList();
		list.add("hello");
		list.add("world");
 
		List<Integer> intlist = list;
 
		for (int i = 0; i < intlist.size(); i++) {
			System.out.println(intlist.get(i)*100);
		}
	}

上述代码编译通过,但是运行时 intlist.get(i)*100 会报错,很明显 intlist 中的元素是无法进行乘法运算的,导致报错。

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
 
		// string集合的集合
		List<ArrayList<String>> array_string_list = new ArrayList<ArrayList<String>>();
 
		// 原始的集合 指向 string集合的集合
		List arry = array_string_list;
 
		ArrayList<String> lst_string = new ArrayList<String>();
		lst_string.add("abcde");
		// 原始集合可以不受限制的賦值任何集合,甚至是任何对象,反正最终都是变成Object对象
		arry.add(lst_string);
 
		
		ArrayList<Integer> lst_int = new ArrayList<Integer>();
		lst_int.add(10);
		// 原始集合可以不受限制的賦值任何集合
		arry.add(lst_int);
 
		// arry即array_string_list,有2个元素,第一个元素是string的泛型集合,第二个元素是int的泛型集合。
		// 形成混乱,导致运行出错
		System.out.print(array_string_list.size());// 2个元素
		System.out.print(array_string_list.get(1).get(0));//运行时遇到转型错误。
	}

同理,上面的代码在最后一行也会导致运行出错。所以编程的时候,要注意伪泛型的陷阱。

参考:《疯狂 Java》

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么说 Java 的泛型是伪泛型?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档