黑马程序员技术交流社区

标题: 泛型 [打印本页]

作者: 周敏2011nc    时间: 2011-12-21 17:40
标题: 泛型
本帖最后由 周敏2011nc 于 2011-12-27 08:52 编辑

泛型的作用有哪些方面,它的存在时期?

该贴已经同步到 周敏2011nc的微博
作者: 窦超    时间: 2011-12-21 17:46
泛型赋予了类型参数式多态的能力

泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。

作者: 余松霖    时间: 2011-12-21 17:55
泛型的好处是安全简单。在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
是java1,5之后的新特性,
作者: 为梦而战    时间: 2011-12-21 18:00
泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制
作用:1.将运行时期出现的问题:classCastException,转移到了编译时期,方便于程序员解决问题,让运行时候问题减少,安全
      2.避免了强制转换麻烦
使用范围:类(生存期:在整个类中有效),方法,接口
特殊之处:静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上


作者: 冯瑞君老师    时间: 2011-12-21 18:10
本帖最后由 f64412300 于 2011-12-21 18:11 编辑

泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。
允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。
· 消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

· 潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。
作者: 陈帅雷    时间: 2011-12-21 18:17
型赋予了类型参数式多态的能力

泛型的第一个好处是编译时的严格类型检查。有效的避免了运行期的ClassCastException,提高了程序的安全性和健壮性。
这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。另外 泛型简化了代码,应用泛型的程序提高程序的可读性,更利于团队的合作开发
作者: 郭繁森    时间: 2011-12-21 19:01
本帖最后由 guofansen 于 2011-12-21 19:02 编辑

1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。  
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。   
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(java.lang.String);

举个例子
有一个篮子工厂,负责生产篮子,但是这个篮子将来是用来做什么的,在设计它的时候并不能确定,有可能是装水果的,也有可能是装馒头的
实际上用的时候,你跟厂家说,我要水果篮子,于是厂家就生产水果篮子,但并不是重新设计制造,而只是在制造的时候把你的要求给记录下来,比如生产出来的篮子只能放你规定的东西,如水果,放其他的就不行,取出来的也是水果,就这样!
作者: 刘健    时间: 2011-12-21 21:49
泛型个人觉得最主要就是函数的重用上,一个函数在应用了泛型后可以接受更多的类型,减少了代码量,增强了代码的可读性
作者: 韩金蕊    时间: 2011-12-22 09:24
public interface Dao<T,PK> {
        /**
         * 插入实体
         * @param entity
         * @return
         */
        boolean insert(T entity);
        /**
         * 更新实体
         * @param entity
         * @return
         */
        boolean update(T entity);
        /**
         * 删除实体
         * @param entity
         * @return
         */
        boolean delete(T entity);
        /**
         * 根据id删除实体
         * @param id
         * @return
         */
        boolean deleteById(PK id);
        /**
         * 查询所有的实体对象
         * @return
         */
        List<T> findAll();
        /**
         * 根据id查询单个实体
         * @param id
         * @return
         */
        T findById(PK id);
        List<T> findNowPageInfo(int nowPage,int pageSize,String where);
}

这是定义一个泛型接口,当别的类实现它的时候,可以直接通过(T,pk)l来实现,比较简单安全,同时减少了类型转换的麻烦,有效的避免了运行期的ClassCastException,提高了程序的安全性和健壮性

作者: 周敏2011nc    时间: 2011-12-22 09:52
大家注意到一个问题没有 : 当我们用反射取到一个方法时,它会忽略泛型的信息 :
public class AzonalDemo {
   public static void main(String[] args) throws Exception{
           ArrayList<Integer> list = new ArrayList<Integer>();
           String str = "abc";
           Method method = list.getClass().getMethod("add", Object.class);
           method.invoke(list, str);
           System.out.println(list);
   }
}
这是不是说明 : 泛型的存在时期只是在编译阶段,而且泛型的信息并不存在字节码中,通过反射拿到的字节码没有泛型信息?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2