java之泛型潜在错误

如果使用带泛型声明的类时,没有传入类型参数,那么这个类型参数默认是声明该参数时指定的第一个上限类型,这个类型参数被称为raw type(原始类型 )。

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)); 
        } 
    }

}

输出:

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); 
        } 
    }

}

输出结果:

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); 
//        } 
    }

}

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 + "]"; 
    }

}

注:(1)处将Apple<Integer>对象赋给一个Apple变量,在(2)出输出时该对象的将丢失所有的泛型信息。即尖括号里的所有信息,包括getApples()方法的返回值的类型List<String>里的尖括号信息。

Java是不允许创建泛型数组 。

时间: 2025-01-06 15:08:24

java之泛型潜在错误的相关文章

Java中泛型 类型擦除

转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下面一个列子,代码如下: public class Foo { public void listMethod(List<String> stringList){ } public void listMethod(List<Integer> intList) {

Java 中泛型的全面解析

Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JDK 5中的新集合类框架中.对于泛型概念的引入,开发社区的观点是褒贬不一.从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误.而从不好的地方来说,为了保证与旧有版本的兼容性,Java泛型的实现上存在着一些不够优雅的

Java中泛型 使用

泛型: 1.5  之后出现  提高安全 1      泛型 确定 集合容器的类型. 2      <> 接收一种数据类型,(引用数据类型) ArrayList<String> lis = new ArrayList<String>() 目的: 将运行时期的 错误 转化到 编译时期,提高了安全性! 3      不需要 强制类型转换.  更加安全! 泛型的 擦除: 泛型在编译时期使用!使用完毕直接擦除. 编译完的时候 不存在 泛型. 好处: 使用了 泛型,不自需要强制类型

C++ Java C#泛型

泛型概述C#中的泛型C#泛型和java泛型的比较C#泛型和C++模板的比较C#泛型中的约束 泛型概述 Bruce Eckel :您能对泛型做一个快速的介绍么? Anders Hejlsberg : 泛型其实就是能够向你的类型中加入类型参数的一种能力,也称作参数化的类型或参数多态性.最著名的例子就是List集合类.一个List是一个易于增长的 数组.它有一个排序方法,你可以为 它做索引,等等.现在,如果没有参数化的类型,那么不论使用数组还是使用List都不是很好.如果你使用数组,你能获得强类型,因

十:Java之泛型

[定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象.(这是当今较常见的定义) 在程序编码中一些包含参数的类.其参数可以代表类或对象等等.(现在人们大多把这称作模板) 不论使用那个定义,泛型的参数在真正使用泛型时都必须作出指明. 泛型类,是在实例化类的时候指明泛型的具体类型: 泛型方法,是在调用方法的时候指明泛型的具体类型. 二.使用泛型的目的: 一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一

java使用泛型实现Bean类和Map的相互转换

java使用泛型实现Bean类和Map的相互转换,使用泛型可以这带来了很多好处: 首要就是类型安全, Java 程序的类型安全.通过知道使用泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中).       泛型允许编译器实施这些附加的类型约束.类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来.   将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性. 消除强制类型转换. 泛型的一个附带好处是,

Java之泛型

1. 概述          在引入泛型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入泛型后,一个复杂类型就可以在细分成更多的类型.          例如原先的类型List,现在在细分成List<Object>, List<String>等更多的类型.          注意,现在List<Object>, List<String>是两种不同的类型,他们之间没有继承关系,即使String继承了Object.下面的代码是非法的: 1

nested exception is java.sql.SQLException: IO 错误

1.错误描述 (mx.messaging.messages::ErrorMessage)#0 body = (null) clientId = "18CE3B03-9709-9DA8-7634-340C23317FDD" correlationId = "3161DF25-D056-D694-E5CF-963E4FE036D9" destination = "waitController" extendedData = (null) faultC

J2EE引擎出现java.lang.UnsatisfiedLinkError:&#160;CC错误的原因

运行JSP报表程序页面出现java.lang.UnsatisfiedLinkError: CC错误有以下几种原因和处理方法: 1.请查看控制台的错误信息 a:如果控制台的消息是类似 java.lang.UnsatisfiedLinkError: no MRChkLib in java.library.path,Error loading library MRChkLib 这样的错误信息,那么是因为MRChkLib.dll没有拷贝到windows的System32目录下. (MRChkLib.dl