java之泛型潜在错误
2016-06-04 22:57
323 查看
如果使用带泛型声明的类时,没有传入类型参数,那么这个类型参数默认是声明该参数时指定的第一个上限类型,这个类型参数被称为raw type(原始类型 )。
eg:
public class ListTest {
}
输出:
aaaa
bbbbbbb
cccc
上述程序编译,及运行一切正常。可以看出当程序把一个原始类型的变量赋给一个带有泛型信息的变量时,只要它们的类型保持兼容---例如将List变量赋给List<Integer>,无论list集合里实际包含什么类型的元素,系统都不会有任何问题。不过需要指出当把一个原始类型的变量(如List变量)赋给带泛型信息的变量时会有一个潜在的问题:JVM会吧集合里盛装的所有元素当作Integer来处理。如果输出涉及到集合元素的类型,程序运行时出现ClassCastException。
eg:
public class ListTest {
}
输出结果:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at com.zb.zb.ListTest.main(ListTest.java:11)
eg2
public class ListTest {
}
class Apple<T extends Number>{
}
注:(1)处将Apple<Integer>对象赋给一个Apple变量,在(2)出输出时该对象的将丢失所有的泛型信息。即尖括号里的所有信息,包括getApples()方法的返回值的类型List<String>里的尖括号信息。
Java是不允许创建泛型数组 。
eg:
public class ListTest {
public static void main(String[] args){
List list = new ArrayList();
list.add("aaaa");
list.add("bbbbbbb");
list.add("cccc");
List<Integer> intList = list;
for(int i=0; i<intList.size(); i++){
System.out.println(intList.get(i));
}
}
List list = new ArrayList();
list.add("aaaa");
list.add("bbbbbbb");
list.add("cccc");
List<Integer> intList = list;
for(int i=0; i<intList.size(); i++){
System.out.println(intList.get(i));
}
}
}
输出:
aaaa
bbbbbbb
cccc
上述程序编译,及运行一切正常。可以看出当程序把一个原始类型的变量赋给一个带有泛型信息的变量时,只要它们的类型保持兼容---例如将List变量赋给List<Integer>,无论list集合里实际包含什么类型的元素,系统都不会有任何问题。不过需要指出当把一个原始类型的变量(如List变量)赋给带泛型信息的变量时会有一个潜在的问题:JVM会吧集合里盛装的所有元素当作Integer来处理。如果输出涉及到集合元素的类型,程序运行时出现ClassCastException。
eg:
public class ListTest {
public static void main(String[] args){
List list = new ArrayList();
list.add("aaaa");
list.add("bbbbbbb");
list.add("cccc");
List<Integer> intList = list;
for(Integer i : intList){
System.out.println(i);
}
}
List list = new ArrayList();
list.add("aaaa");
list.add("bbbbbbb");
list.add("cccc");
List<Integer> intList = list;
for(Integer i : intList){
System.out.println(i);
}
}
}
输出结果:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at com.zb.zb.ListTest.main(ListTest.java:11)
eg2
public class ListTest {
public static void main(String[] args){
Apple<Integer> a = new Apple<Integer>(6);
for(String apple :a.getApples()){
System.out.println(apple);
}
Apple b = a; (1)
// for(String apple : b.getApples()){ (2)
// System.out.println(apple);
// }
}
Apple<Integer> a = new Apple<Integer>(6);
for(String apple :a.getApples()){
System.out.println(apple);
}
Apple b = a; (1)
// for(String apple : b.getApples()){ (2)
// System.out.println(apple);
// }
}
}
class Apple<T extends Number>{
T size;
public Apple(){
}
public Apple(T size){
this.size = size;
}
public void setSize (T size){
this.size = size;
}
public List<String> getApples(){
List<String> list = new ArrayList<String>();
for(int i = 0; i < 3; i++) {
list.add(new Apple<Integer>(10 * i).toString());
}
return list;
}
public String toString(){
return "Apple[size=" + size + "]";
}
public Apple(){
}
public Apple(T size){
this.size = size;
}
public void setSize (T size){
this.size = size;
}
public List<String> getApples(){
List<String> list = new ArrayList<String>();
for(int i = 0; i < 3; i++) {
list.add(new Apple<Integer>(10 * i).toString());
}
return list;
}
public String toString(){
return "Apple[size=" + size + "]";
}
}
注:(1)处将Apple<Integer>对象赋给一个Apple变量,在(2)出输出时该对象的将丢失所有的泛型信息。即尖括号里的所有信息,包括getApples()方法的返回值的类型List<String>里的尖括号信息。
Java是不允许创建泛型数组 。
相关文章推荐
- java 创建文件和文件夹
- SpringMVC——接收请求参数和页面传参
- Java设计模式
- java FileOutputStream写入文件
- SpringMVC之matrixVariable
- JAVA并发编程
- java web工程怎样改名
- 详解spring中每个jar包的作用
- java 实现n个整数的全排列
- java反射机制
- (45). Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
- Struts2-学习笔记系列(15)-ajax支持和JSON
- Struts2-学习笔记系列(14)-拦截器
- Struts2-学习笔记系列(14)-拦截器
- Struts2-学习笔记系列(13)-类型转换异常和校验器
- Struts2-学习笔记系列(12)-set集合
- Struts2-学习笔记系列(12)-set集合
- Struts2-学习笔记系列(11)-使用StrutsTypeConverter
- java 实现二叉树的构建,先序,中序,后序,层次,递归,非递归的遍历
- Struts2-学习笔记系列(10)-自定义类型转换