java SE 泛型

来源:互联网 发布:网络与新媒体真的好吗 编辑:程序博客网 时间:2024/05/17 23:21
摘自毕向东的java SE视频,这里要特别赞一下这个视频,真的很不错。

很多视频的讲解都会专门讲一下JDK基本数据类型自动装箱的功能。
同时,泛型也是JDK 1.5之后出现的特性。
首先用于解决类型安全问题。
数组的安全性比较好,如定义时 int[] x = {1,2,3};如果放入了非int类型值,在编译期间就会报错,而非运行期。
如果使用集合,如
ArrayList a = new ArrayList();
a.add(new String("abc")); //添加一个String对象
a.add(4);  //添加一个Interger对象
//Type safety: The method add(Object) belongs to the raw type ArrayList. References to //generic type ,ArrayList<E> should be //parameterized。在eclipse中,会有这个warn提示,提示类型安全。提示增加数据类型。
a.add(4)后,编译期间不会报错,会在运行期间报错。
如果使用泛型,
ArrayList<String> al = new ArrayList<String> ();
则可以:
1. 将问题从运行期转移到了编译期,方便于程序员解决问题;
2. 避免了强制类型转换的问题,(迭代时Iterator,放在迭代器中的是Object)
而且,在javac编译时,警告消息会显示

泛型格式:通过<>来定义要操作的引用类型
在使用java提供的对象时,什么时候写泛型呢?通常是在集合框架中使用。
只要定义<>,就要使用泛型。如API中ArrayList<E>, add(E e)方法。
当使用集合时,将集合要使用的数据类型传到<>即可。
迭代器、比较器、集合,都是用泛型了。

----------泛型类-------------
泛型定义在类上。
class Tool<T>       //泛型类
{
    private T t;
    public T getObject()
    {
        return t;
    }
    public void setObject(T t)
    {
        this.t = t;
    }
}
使用时,Util<Worker> util = new Util<Worker>; util.setObject(new Worker());
定义泛型类:
当类中要操作的引用数据类型不确定时,早期定义Object来完成扩展;而现在使用泛型来完成扩展
泛型类定义的泛型,在整个类中有效;如果被方法调用,那么泛型的类的对象明确要操作的具体类型后,所有要操作的类型就固定了。


---------------定义在方法上的泛型------------------------

为了让不同的方法可以操作不同类型,而且类型还不确定,可以将泛型定义在方法上
class Demo
{
    public <T> void show(T t)   //注意把泛型定义在方法上的格式
    {
        System.out.println();
    }
    public <T> void print(T t)  
    {
        System.out.println();
    }
}
//静态方法不可以访问类上定义的泛型。如
class Demo<T>
{
    public <T> void print(T t)  
    {
        System.out.println();
    }
    public static void soft(T t)
    {
        System.out.println(t);
    }
}
//eclipse中报错,Cannot make a static reference to the non-static type T
如果静态方法操作的应用数据类型不确定,可以讲泛型定义在方法上。
    public static <T> void soft(T t)
    {
        System.out.println(t);
    }
    
-----------泛型定义在接口上------------------------
interface Inter<T>
{
    void show(T t);
}
class InterImpl<T> implements Inter<T>
{
    public void show(T t)
    {
        System.out.println("show : "+t);
    }
}



------------泛型限定--------------------------
通配符ArrayList<?>,<?>是个占位符,说明这里有泛型。
    public static void printColl(ArrayList<String> a1)
    {
        Iterator<String> it = a1.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
    }
如果打印ArrayList<String>类型容器,可以使用这个函数;但如果另外还想打印ArrayList<Interger>类型变量,则可以使用ArrayList<?>,通配符?表示。
    public static void printColl(ArrayList<?> a1)  //考虑T和?的区别。
    {
        Iterator<?> it = a1.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
    }
这时,就可以往函数传入Integer和String类型ArrayList。

如ArrayList<? Extends Person>,泛型限定
上限,下限
<? extends E>,上限
<? super E>,接收E类型和E的父类,下限



原创粉丝点击