如果使用带泛型声明的类时,没有传入类型参数,那么这个类型参数默认是声明该参数时指定的第一个上限类型,这个类型参数被称为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是不允许创建泛型数组 。 

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

  1. Java 中泛型的全面解析(转)

    Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在J ...

  2. Java中泛型 类型擦除

    转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...

  3. 跟着刚哥梳理java知识点——泛型(十三)

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...

  4. Java“禁止”泛型数组

    Java“禁止”泛型数组 原文:https://blog.csdn.net/yi_Afly/article/details/52058708 1. 泛型定义泛型编程是一种通过参数化的方式将数据处理与数 ...

  5. Java 之泛型通配符 ? extends T 与 ? super T 解惑

    简述 大家在平时的工作学习中, 肯定会见过不少如下的语句: List<? super T> List<? extends T> 我们都知道, 上面的代码时关于 Java 泛型的 ...

  6. C++ Java C#泛型

    泛型概述C#中的泛型C#泛型和java泛型的比较C#泛型和C++模板的比较C#泛型中的约束 泛型概述 Bruce Eckel :您能对泛型做一个快速的介绍么? Anders Hejlsberg : 泛 ...

  7. Java之泛型

    1. 概述          在引入泛型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入泛型后,一个复杂类型就可以在细分成更多的类型.          例如原先的类型List ...

  8. java基础-泛型举例详解

    泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...

  9. Java学习——泛型

    Java学习——泛型 摘要:本文主要介绍了什么是泛型,为什么要用泛型,以及如何使用泛型. 部分内容来自以下博客: https://www.cnblogs.com/lwbqqyumidi/p/38376 ...

随机推荐

  1. 10个强大的Apache开源模块

    1.单点登录模块 LemonLDAP LemonLdap可以很棒地实现Apache的SSO功能,并且可以处理超过 20 万的用户请求.LemonLdap支持Java, PHP, .Net, Perl, ...

  2. Spout数据源

    Spout 数据源 消息源 Spout 是 Storm 的 Topology 中的消息生产者(即 Tuple 的创造者). Spout 介绍 1. Spout 的结构 Spout 是 Storm 的核 ...

  3. Sublime Text 2 使用心得

    一. 前言 作为一个前端,有一款好的开发利器是必不可少的,editplus.notepad++都是不错的工具,体积轻巧,启动迅速(dw太浮肿了).最近,又有一款新的编辑器诞生,席卷前端界,惹得无数喜爱 ...

  4. JavaScript- The Good Parts Chapter 5 Inheritance

    Divides one thing entire to many objects;Like perspectives, which rightly gazed uponShow nothing but ...

  5. ubuntu14.04中安装QuartusII9.1步骤

    家里的计算机安装了WIN10,出于够用且安装文件小,想安装QuartusII9.1,按M$风格,驱动绝对是安不上的.正好是双系统ubuntu14.04 64位.安装过程不太顺利,记录下来,当作已经不灵 ...

  6. HDU4619+匈牙利

    /* 匈牙利算法 二分匹配 最小点覆盖=最大匹配. 即踢掉最小点覆盖 */ #include<stdio.h> #include<string.h> #include<s ...

  7. android之自定义ViewGroup和自动换行的布局的实现

    viewgroup简单说就是可以装view的view.今天遇到一个问题,就是需要一个可以自动根据一行中view的宽度自动换行的布局,网上 找了下,没有相关的例子,但是找到了思路:自定义一个viewgr ...

  8. C#中Enum用法小结

      enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储. (1)默认情况下,枚举中的第一个变量被赋值为0,其他的变量的值按定义的顺序来递增(0,12,3...),因此 ...

  9. Cocos2d-x之Touch事件处理机制

    一.两种机制的四种不同的事件 CCStandardTouchDelegate 默认事件   virtual void ccTouchesBegan(CCSet *pTouches, CCEvent * ...

  10. 转:maven报错非法字符:\65279 错误

    开发中一个项目很早就报这个错,maven报错非法字符:\65279 错误,今天终于忍无可忍要解决它 :编译java文件的时候,有些java文件报非法字符 \65279错误,在网上找和很多 方法,也试了 ...