zoukankan      html  css  js  c++  java
  • 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();//不需要进行类型转换

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

                    

  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/chenfei0801/p/3653135.html
Copyright © 2011-2022 走看看