Java 泛型小结

来源:互联网 发布:淘宝网 话费充值 编辑:程序博客网 时间:2024/05/17 01:19

转:http://blog.sina.com.cn/s/blog_69a4df530100p8w1.html

经过将近两个小时的学习与思考,对java泛型有了新认识,之前一直都是随便用用,而没有深入学习、思考,趁着现在有空闲时间,重新再学一下泛型,才明白其较深层的意思。

学习泛型时,最大困惑的就是里面的通配符使用。现在好好总结一翻:首先从网上的仁兄那,解析下,什么是泛型,为什么要使用泛型:

泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。

接下来,就是实践了,话不在多,直接看代码:

 package com.gen.test;

 

 

class A<K, V> {

    private K name;

    private V size;

 

    public K getName() {

       return name;

    }

 

    public void setName(K name) {

       this.name = name;

    }

 

    public V getSize() {

       return size;

    }

 

    public void setSize(V size) {

       this.size = size;

    }

 

}

 

public class TestGen1 {

 

    public static void main(String[] args) {

       A<String,Integer> a = new A<String,Integer>();

       a.setName("william");

       a.setSize(176);

       System.out.println(a.getName());

       System.out.println(a.getSize());

    }

}

这里给我们的启动时,泛型有点像C++里的模块。

 

//////////////////////////////////////////demo two//////////////////////////////////////////

package com.gen.test;

 

 

class B<K extends String, V extends Integer> {

    private K name;

    private V size;

 

    public K getName() {

       return name;

    }

 

    public void setName(K name) {

       this.name = name;

    }

 

    public V getSize() {

       return size;

    }

 

    public void setSize(V size) {

       this.size = size;

    }

 

}

 

public class TestGen2 {

 

    public static void main(String[] args) {

       A<String,Integer> a = new A<String,Integer>();

       a.setName("william");

       a.setSize(176);

       System.out.println(a.getName());

       System.out.println(a.getSize());

    }

}

会发现,在类的声明处,用了一个叫extends的关键字,有必要说一下:

Extends: 上界用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。

Super: 下界用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object

下面,利用作图法,使我们能看得更清楚:

假如代码如下:<? Extends Date><? Super Date>

作图如下:
图片

看了图之后,就不难理解了。

如果对此想深入研究的话,请参考下面的一位仁兄写的文章:

http://fyting.javaeye.com/blog/122732

最后我想说一下,“?”这个问题的用法:

先看代码:

 

class C<K ,V extends Number> {

    }

 

class D<J extends C<String,? super Number>,K>{

}

C<String,? super Number>:?处,只能传入以Number为下限的东西,即Number的父类而class C<K ,Vextends Number>又限定了,只能传以Number为上限的东西,即Number的子类,最终限定了,我们只能传Number

public class TestGen3 {

 

    public static void main(String[] args) {

       public static void main(String[] args) {

       D<C<String,Integer>,String> d = new D<C<String,Integer>,String>();

    }

}

个人觉得,学习泛型是一个需要仔细思考的一个过程,有了这些基础之后,相信对看一些开源框架有帮助,毕竟写框架的作者都是些高手。

今天学习了java annotation与泛型,巩固一下自己的基础。

0 0