• Java 泛型


    什么是泛型?

             声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者接口。

              如List<E> 读做E的列表。E代表了元素类型

    请不要在新代码中使用原生态泛型

             所谓原生态泛型,指的是不带任何实际类型参数的泛型名称。如List<E>相对应的原生态类型为List。

              原生态类型,不具有泛型在安全性和表达性方面的所有优势。之所以存在,是为了兼容以前版本。

    List<Object> VS List

                List逃避了泛型检查,但是后者明确告诉编译器,他能够持有任何对象。

                 如果一个方法中,有一个参数,类型为List。你可以讲一个List<String>传递给这个参数,但是如果这个参数类型为List<Object>,你则不能将

                 List<String>传递给这个参数。

                 泛型有子类型化的规则,List<String>是原生态List的一个子类型,而不是参数化类型List<Object>的子类型。

                  总之,如果使用像List这样的原生态类型,就会失掉类型安全性,如果使用像List<Object>这样的参数化类型,则不会

    List<?> VS List

               List<?>为无限制通配类型

               原生态的List由于可以放进任何元素,所以很容易破坏该集合的类型约束条件。但是不能将任何元素放到无限制通配类型中(List<?>),null除外

                下面这个是有问题的:

                   

           public void add(List<?> list) {
    		list.add("as");//编译不通过,因为不能往这个无限制通配符中将任何数据(NULL除外)
    list.add(null);//编译通过 }

      

     

               总之List<Object>是个参数假类型,表示可以包含任何对象类型的一个集合。List<?>则是一个通配符类型,表示只能包含某种

               未知对象的类型集合。List则是个原生态类型,他脱离了泛型类型。前两种是安全的,最后一种不安全。

    数组与泛型

              数组与泛型相比,有两个不同点。 

                 1) 数组是协变的。即如果有一个Sub类,其父类为Super。那么数组类型Sub[]就是Super[]的子类型。但是泛型则不是这样的,List<Sub>既不是List<Super>的子类型也不是父类型。换句话说,两者之间没有关系。

                 2)数组时具体化的。数组必须在初始化就得指定类型。而泛型是通过擦除来实现的。因此泛型只在编译时强化他们的信息,并在运行时丢弃它们的元素信息。如List<E>,可以再运行时才指定具体的类型

                数组与泛型不能很好的混用,创建泛型、参数化或者类型参数的数组都是非法的,如new List<E>[]、new List<String>[]、new E[]都是方法的。

               虽然上述几种创建数组方式是非法的,但是E[] e = (E[]) new Object[LENGTH],则是合肥的,但这种方式确不是类型安全的。

    优先考虑泛型

           如编写一个类,来模拟栈操作,可以用如下方式,来处理不同元素时的栈进出情况

              public Class Stack<E> {或者Static<E extends OwnClass>

                    private E[] elements;

                      public E pop() {

                         ...........

                       }

            }

               这样客户端在使用的过程中,不需要最类型转换 

                       如 Statck<String> s = new Statck<String>();

                            String e = s.pop();//不需要进行类型转换

               这种方式比直接进行类型转换更加安全也更加容易。

                    

  • 相关阅读:
    [已解决]报错:Failed to restart network.service: Unit network.service not found
    [已解决]PostgreSQL报错:cannot begin/end transactions in PL/pgSQL解决方法
    Navicat连接Hive
    [已解决]报错:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    [已解决]报错:Unknown system variable 'query_cache_size'
    [已解决]报错: Unable to load authentication plugin 'caching_sha2_password'.
    python小练习
    Oracle消除重复记录的几种方式
    Android支持ARM架构软件包安装Genymotion-ARM-Translation_for_8.0
    Centos7上安装DBDIFF
  • 原文地址:https://www.cnblogs.com/chenfei0801/p/3653135.html
Copyright © 2020-2023  润新知