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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gezhizheng 中级黑马   /  2015-1-28 16:35  /  815 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在项目开发中我们会不可避免的使用到泛型,java中的泛型对于初学者来说比较难理解,希望这个帖子能够引入高手对于java泛型的讨论。
一下是我理解中泛型的作用:
public class Holder<A, B> {
        public final A a;
        public final B b;

        public Holder(A a, B b) {
                this.a = a;
                this.b = b;
        }

        public static void main(String args[]) {
                String first = "This is a member of class Holder named A";
                String second = "This is a member of class Holder named B";
                Holder<String, String> holder = new Holder<String, String>(first,
                                second);
                System.out.println(holder.a);
                System.out.println(holder.b);
        }
}
以上泛型的作用之一:一个方法返回两个参数。
看了一下的代码你就会明白如何使用java泛型实现“一个方法返回两个参数”
public Holder<int,String>getTwoParameters(){
    int first=0;
    String second ="I am the second parameter";
    return new Holder<int,String>(first,second);
}
相当简单,如果你要在代码中获取这两个参数,也相当方便:
Holder<int,String> holder= getTwoParameters();
  int first = holder.first;
  String second = holder.second;

值得注意的是,first 和second两个参数不会改变原先生成的holder中的参数中,first是int型(基本数据类型),second是String型(引用数据类型),如果对first重新赋值则会改变first在内存区的值,而对second赋值,则会让second指向另外一个String类型的内存区。以上两种都不会改变原先holder对象中的值,如果你在使用Holder类的对象时,想进行如下操作:
holder.first = 3;
holder.second = 4;

final类型的first和second会阻止你这么做,因为final保护了first和second不会被改变。这就体现了泛型代码的可读性和安全性,真心让人觉得Sun的牛X所在。
以上分析的都是泛型类的使用方法,下面来考虑一下泛型函数的使用。
泛型函数最简单的使用就像这样:

        public <T, M, D> void generosityFunction(T member1, Math member2,
                        Deprecated member3) {
                System.out.println(member1.getClass().getName());
                System.out.println(member2.getClass().getName());
                System.out.println(member3.getClass().getName());
        }

这种方法可以写一个函数,但是其形式参数是未知类型,也就是说可以传入任何类型的参数作为该方法的形式参数。
这种方法的功能及其有限,因为方法体本身并不知道传入的形式参数到底是什么类型的,所以无法在方法体内对这个参数进行各种有效的操作。
举个简单的例子:使用以上方法传入参数

generosityFunction(1,2,3)

在方法体重无法对传入的1,2,3进行具体操作,只能够简单的执行一些打印操作,没有太多的实际用处,除了以下的用法,用来快捷的创建容器类,而且封装性较好,代码的可读性比较高,一看就懂:
//新建一个Map对象
        public static <K, V> Map<K, V> newAMap() {
                return new HashMap<K, V>();
        }
//新建一个List对象
        public static <T> List<T> newAList() {
                 return new ArrayList<T>();
        }


       public static void main(String args[]) {
              List<String> strings = newAList();
             Map<String, Integer> integers = newAMap();
        }

希望能人多多指点。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马