A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 墓____夜 中级黑马   /  2014-5-29 14:51  /  1348 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是泛形,泛形有什么特点?

5 个回复

倒序浏览
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
泛型是提供给javac 编译器使用的,可以限定集合的输入类型,让编译器挡住源代码程序中的非法输入,编译器编译带类型说明的集合时会擦除"类型"信息,使程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样, 由于编译器生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合加入其它类型的数据,例如,用反射得到集合,在调用其add方法就可.
  1. package com.itcast.generic;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Random;

  5. public class GenericTest1 {
  6.         public static void main(String[] args) {
  7.                 List list = new ArrayList();
  8.                 list.add(new Random());
  9.                 list.add("abc");
  10.                 //运行时会出错,但编码时发现不了---throw java.lang.ClassCastException
  11.                 Integer num = (Integer) list.get(0);  
  12.         }
  13. }
复制代码
而使用泛型之后:



085855_qt6o_1427560.jpg (103.68 KB, 下载次数: 9)

085855_qt6o_1427560.jpg
回复 使用道具 举报
墓____夜 来自手机 中级黑马 2014-5-29 15:57:45
藤椅
泛形又有什么作用呢?
回复 使用道具 举报
泛型的作用就是一个限定,用来限定传入的数据类型,如<String>就是说要传入的是String类型,反正呢,就是把一些运行时的语法异常转到了编译时异常,编译的时候就会出现提示,方便我们发现问题的所在
回复 使用道具 举报
本帖最后由 相濡、彼岸 于 2014-5-29 22:37 编辑

基于视频上的总结:估计也就这些了吧,不是很系统,我也刚学完这部分不久!

(1) 泛型的出现是用于解决安全问题的,是一个安全机制。
      简单的说就是将以前运行时期出现的问题 :ClassCastException (类型转换异常),转移到了编译时期,方便解决问题,提高安全性,避免强制转换麻烦。

(2)<> 中接收的是引用数据类型

(3)泛型既可以定义在类上,接口上,也可以定义在方法上,而且泛型类里面可以有泛型方法,静态方法不可以访问类上定义的泛型。

(4)泛型类:当类中要操作的引用数据类型不确定的时候,就定义泛型来完成扩展。

(5)泛型方法:当我们定义了一个功能,但是不知道这个功能操作什么类型的数据时,可以定义泛型。
                     也可以定义在静态方法上。

(6)<E>:这里的E是定义了一个具体的类型,比如上传个String,然后就只能操作String类型的数据!
    <?>:是一个通配符,也可以叫占位符,可以传任意类型的。
     <? extends E>:此时是可以接收E类型,或者是E的父类型,称为上限。
      <? super E>:此时是可以接收E类型,或者是E的子类型,称为下限。
回复 使用道具 举报
使用泛型之前的代码就是错误的,new Random()生成的是一个对象,new Random().nextInt()才是数字。第二个也不对,new Random()不是String类型的。
  1.         public static void main(String[] args) {
  2.                 List<String> list = new ArrayList<String>();
  3.                 list.add(((Integer) new Random().nextInt()).toString());
  4.                 list.add("abc");
  5.                System.out.println(list.get(0));
  6.         }
复制代码



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马