JAVA泛型

来源:互联网 发布:红楼梦贾迎春知乎 编辑:程序博客网 时间:2024/05/23 15:11

我先对java泛型的注意点还有作用,优势做一个简单的阐述

   1. java 泛型参数只能是类类型(如Integer,String,还有一些类类型  ),不能是简单类型.

   2.泛型可以说明任何实例方法中的局部变量,类的成员变量,方法的形式参数,以及方法的返回值.

   3.泛型 保证的对象间类型转换的安全,也简化了过程,不必在Object类和实际操作的数据类型之间进行强制类型转换.

   4.泛型可以将所有的对象强制类型转换成自动转型和隐式类型,泛型扩展了重复使用代码的能力,而且既安全又简单.

  

   范例一:在没有泛型时,大家都会遇到如下问题.

             class  Apple

             {

                      private static long counter;

                      private final long id = counter++;

                      public long id()

                      {

                              return id;

                      }

             }

            class Orange{}

            class  Test

            {

                     public static void main(String[]args)

                     {

                              ArrayList  arrayList = new ArrayList();

                              //可以想ArrayList中添加任何对像,在编译期和运行期没有任何错误

                              for(int i=0;i<3;i++)

                              {

                                     arrayList.add(new Apple());

                              }

                              arrayList.add(new Orange());

                              for(int i=0; <arrayList.size();i++)

                              {

                                   Object obj = arrayList.get(i);

                                    //必须进行强制类型转换

                                   Apple apple = ((Apple)arrayList.get(i)).id();

                                   //当将Orange对象转换为Apple时报错

                              }

                            

                     }

            }

  范例分析:  Apple类和Orange 类除了继承自Object  ,两个类是完全不同的类(如果一个类没有明确继承自那个类,那么他自动继承自Object类)

                     因为ArrayList 保存的是Object类,因此你不仅可以通过ArrayList 中的Add()方法添加Apple对象  还可以添加Orange对象.无论是在

                     编译期还是运行期都不会有问题. 当你用ArrayList的get()方法取出你认为是Apple 对象的方法时,你得到的只是Object 的引用,必须

                     将其强制转型为Apple,否责会有语法错误.当将Orange  转型为Apple时,就会右语法错误.

  范例二:用泛型来解决范例一中,不安全,类型转换,问题,代码如下

              class Test2

              {

                    public static void main(String[]args)

                    {

                              ArrayList<Apple>  arrayList = new ArrayList<Apple>();

                              for(int i=0; i<3;i++)

                              arrayList.add(new Apple());

                              //不能向ArrayList  中添加Orange对象,泛型已经确定是Apple对象

                              arrayList.add(new Orange());

                            

                             //从ArrayList中取出对象,并调用对象的方法

                             for(int i= 0;i<arrayList.size();i++)

                             {

                                    //将不需要进行强制类型转换

                                    System.out.println(arrayList.get(i).id());

                             }



                             for(Apple c: arrayList)

                             {

                                     System.out.println(c.id());

                             }

                    }

              }

      范例三:当你指定某个类型作为泛型参数时,你并不仅限于只能将该确切类型的对象放置到容器中,向上转型也可以像作用与其他类型一样作用于泛型

                  class  a1 extends Apple{}

                  class  a2 extends Apple{}

                  class  a3 extends Apple{}

                  class Test

                  {

                          public static void main(String[]args)

                          {

                                ArrayList<Apple>  arrayList = new ArrayList<Apple>();

                                arrayList.add(new a1());

                                arrayList.add(new a2());

                                arrayList.add(new a3());

                               

                                for(Apple c : arrayList)

                                {

                                     System.out.println(c);

                                }

                          }

                  }    

            范例三:自定义泛型类

            public  class MyFirstGeneric<T>

            {

                  T t;

                  MyFirstGeneric(T t1)

                 {

                       t = t1;

                 }

                 T getT()

                 {

                            return t;

                 }

                 void  printType()

                 {

                        System.out.println(t.getclass.getName());

                 }

                 public static void main(String[]args)

                 {

                         MyFirstGeneric<String>    str = new  MyFirstGeneric<String>("sdd");

                         str.printType();

                         String string = str.getT();

                         MyFirstGeneric<Date>    date = new  MyFirstGeneric<Date>(new Date());

                         date.printType();

                         Date d = date.getT();


                  }

            }