JAVA 不支持泛型数组
今日被一同事问道该如何创建Stack<Integer>数组??
答曰:
1 |
Stack<Integer>[] sArray = new Stack<Integer>[10] |
通过代码验证居然无法创建,百度之,原来JAVA不支持泛型数组,因为数组在创建的时候必须知道内部元素的类型,而JAVA泛型是通过擦除法实现,运行时类型参数会被擦掉。例如
1 2 3 |
Stack<String> s = new Stack<String>(); s.push("huhanlin"); String str = s.pop(); |
运行中,类型参数String会被擦掉,只有在最后读取内部元素的时候,会进行一个类型转换,like this。
1 |
String str = (String)s.pop(); |
所以,如果初始化泛型数组的话,运行时编译器只能看到Stack,而看不到Stack中的泛型<String>。数组由于无法确定所持有元素的类型,所以不允许初始化。
由于java的ArrayList也是由数组实现,性能应该不会有太大差异(此处业务逻辑循环量小于十万),最后推荐同事使用集合进行存储。
1 |
List<Stack<Integer>> sCollection = new ArrayList<Stack<Integer>>(); |
如需仍然使用数组,可参考如下写法,但此处不能保证Stack中都是Integer类型,声明数组时没有强制指定Stack的泛型为Integer。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@SuppressWarnings("unchecked") Stack<Integer>[] sArray = new Stack[10]; for(int i = 0; i < 10; i++){ Stack<Integer> s = new Stack<Integer>(); s.push(i); s.push(123); sArray[i] = s; } for (Stack<Integer> stack : sArray) { for (int j = 0; !stack.empty(); j++) { System.out.println("index:"+j+" element:"+stack.pop()); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
index:0 element:123 index:1 element:0 index:0 element:123 index:1 element:1 index:0 element:123 index:1 element:2 index:0 element:123 index:1 element:3 index:0 element:123 index:1 element:4 index:0 element:123 index:1 element:5 index:0 element:123 index:1 element:6 index:0 element:123 index:1 element:7 index:0 element:123 index:1 element:8 index:0 element:123 index:1 element:9 |
但依然可以向Stack中存入其他类型,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Stack<Integer>[] sArray = new Stack[10]; for(int i = 0; i < 10; i++){ Stack s = new Stack<>(); s.push(i); s.push("我是胡翰林"); s.push(123456); sArray[i] = s; } for (Stack<Integer> stack : sArray) { for (int j = 0; !stack.empty(); j++) { System.out.println("index:"+j+" element:"+stack.pop()); } } |
结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
index:0 element:123456 index:1 element:我是胡翰林 index:2 element:0 index:0 element:123456 index:1 element:我是胡翰林 index:2 element:1 index:0 element:123456 index:1 element:我是胡翰林 index:2 element:2 index:0 element:123456 index:1 element:我是胡翰林 index:2 element:3 index:0 element:123456 index:1 element:我是胡翰林 index:2 element:4 index:0 element:123456 index:1 element:我是胡翰林 index:2 element:5 index:0 element:123456 index:1 element:我是胡翰林 index:2 element:6 index:0 element:123456 index:1 element:我是胡翰林 index:2 element:7 index:0 element:123456 index:1 element:我是胡翰林 index:2 element:8 index:0 element:123456 index:1 element:我是胡翰林 index:2 element:9 |
参考文章:
http://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java
http://www.cnblogs.com/exmyth/p/4598971.html
https://www.zhihu.com/question/20928981
©版权声明:本文为【翰林小院】(huhanlin.com)原创文章,转载时请注明出处!
发表评论