黑马程序员技术交流社区

标题: Java的泛型机制 [打印本页]

作者: 张凯zk47    时间: 2014-12-9 10:35
标题: Java的泛型机制
概念:泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以
支持创建可以按类型进行参数化的类。简单的说,就是对要操作的对象指定数据类型,其
用法和形参类似。   如:class Dome<T t>  这里的T就是一个数据类型

泛型后的工具类:

class Tool  //工具类泛型前
{
        private Object obj;
        public void setObject(Object obj)
        {
                this.obj=obj;
        }
}
对于泛型前的Object类型,往往在实例的时候需要考虑强制转换,不仅麻烦还容易引发异常
ClassCastException java jdk1.5版本引入了泛
型机制,解决了这类安全隐患。
class Utils<QQ q>  //工具类泛型后
{
        private QQ q;
        public void setObject(QQ q)
        {
                return q;
        }
}

泛型定义在方法上:
为什么要定义在方法上:因为如上的工具类在类上定义泛型后,那么这个类里面的对象的类型
也就固定了。所以,考虑到为了让不同的对象具备不同的类型,而且类型不确定,那么可以将
泛型定义在方法上。
例如:
class Dome
{
        public <T> void show(T t)
        {
                System.out.println("show"+t);
        }
        public <Q> void print(Q q)
        {
                System.out.println("print"+q);
        }
}
class  GenericDome3
{
        public static void main(String[] args)
        {
                Dome d=new Dome();
                d.show("haha");
                d.show(new Integer(4));
        }
}
泛型类和泛型方法组合使用如下:
class Dome <T>
{
        public  void show(T t)
        {
                System.out.println("show"+t);
        }
        public <Q> void print(Q q)
        {
                System.out.println("print"+q);
        }
}
class  GenericDome3
{
        public static void main(String[] args)
        {
                Dome<String> d=new Dome<String>();
                d.show("haha");
                d.print("haha");
                d.print(new Integer(4));
        }
}
注意:静态方法不可以访问类上定义的泛型,如果静态方法操作的类型不确定,可
以将泛型定义在方法上。


泛型定义在接口上:
interface Inter<T>
{void show(T t)}
class InterImpl<T> implements Inter<T>
{
        public void show(T t)
        {
                System.out.println("show"+t);
        }
}
class GenericDemo
{
        public static void main(String [] args)
        {
                InterImpl i=new InterImpl();
                i.show("hah");
        }
}
泛型的限定:
?通配符,也可以理解为占位符。
?extends E:可以接受E类型或者E的子类型,称为上限。
?super E:可以接受E类型或者E的父类型,成为下限。

class Person
{...}
class Student extends Person
{...}
class Demo
{
        ArrayList<Person> al=new ArrayList<Person>();
        ArrayList<Student> al1=new ArrayList<Student>();
        Iterator<? extends Person>=al.iterator();//(或al1).iterator();这样就既可以迭代Person也可以迭代Student,一般把迭代这部分单独封装成一个功能以提高复用性。
}
下限同理
作者: wf111sxwf    时间: 2014-12-9 11:23
总结的不错啊`
作者: boycechan    时间: 2014-12-9 12:33
学习了,还没学到泛型的!
作者: zzn2508    时间: 2014-12-10 00:02
解释的很清楚,不错
作者: 唐的    时间: 2014-12-10 00:39
真心不错!
作者: wangcongwu    时间: 2014-12-10 00:54
额 我咋看着这么眼熟呢,貌似是我写的吧
作者: wangcongwu    时间: 2014-12-10 01:00
额 我咋看着这么眼熟呢,貌似在哪看见过
作者: 张凯zk47    时间: 2014-12-10 10:51
毕姥爷视屏里面的




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