java基础篇--06<java泛型>

来源:互联网 发布:易趣网与淘宝网的不同 编辑:程序博客网 时间:2024/06/05 17:17

========

  1. java中的集合元素被丢进去之后就失去了类型讯息,在当取出的时候就都成为了Object的类型

    集合加入泛型可以帮助集合记忆这些讯息;

  2. 泛型基础讯息:

    1》修饰类的时候,写在类的后方,区别:在调用的时候需要指明具体类型

      List<String>listString = new ArrayList<String>();

    2》修饰方法,写在返回值前,区别:在调用的的时候会根据传入的参数指明具体类型

      private<T> void Test(T a){}

      inta;

      Stringa;

      Test(a);

      如上T会根据传入的a的类型变成int|| String,不需要像类和接口那样再调用的时候指明

    3》修饰变量,可以作为普通的修饰词来使用

    可以理解:一种特殊的修饰词,除了类之外,可以看到《》的摆放位置都是和正常的修饰词一致

  3. 泛型+extends

class Apple <T>{T info;}//这样写是错误的,算是使用Apple,就必须传入实际的类型class Orange extends Apple<T>{}//这样传入实际参数,正确class Orange1 extends Apple<String>{}//不传参数,默认Object,正确,这时会报警告:使用了未经检查或不安全的操作class Orange2 extends Apple{}



  1. 泛型+编译

//可以看到这里的泛型很好的限定了List中存储数据的类型List<String> list = new ArrayList<String>();List<Integer> list2 = new ArrayList<Integer>();//打印结果相等,不管泛型的实际类型参数是什么,//他们在运行的时候总有同样的类(共一个.class文件)System.out.println(list.getClass() == list2.getClass());



  1. 泛型+static

    静态的东西不能加入<>,因为在使用的时候无法确认泛型的具体代表的实际类型,原理和3中的第一个例子相似

  2. 泛型+包含关系

    List<String>并不能直接用List<Object>这种类型来接,他们并不是包含关系,是两个完全不同的类型

  1. 泛型+通配符重要:解决了6中的问题

    1》基础:List<?>表示可以匹配任何类型

    //以下开始限定范围了

    2》设置上限:List<?extends String> 表明是一个String类型或者是他的子类,上限String

    3》设置下限:List<?super String> 表明是一个String类型或者是他的父类,下限String

    4》使用范围:一般在参数中使用,不可直接用于赋值,详见下8中例子


  1. 不能对任何带<?>通配符的类型进行复赋值操作(B继承A)

List<? extends A> listb = new ArrayList<B>();listb.add(new B());        //上面的例子是错的,因为listb是一个带通配符的,so,                         //它是一个不确定的类型,不能进行任何add操作                //,操作之前可以先进行强制类型转换//可以强制类型转换成A或者A的子类List<A> listA = (List<A>)listb;listA.add(new A());List<B> listB = (List<B>)listb;listB.add(new B());//注意:强制类型转换过后就为”确定的A&B类型“了,就不能在赋值给List<A>List<A> listAA = (List<A>)listB;


注意:Bextends A,

List<A>listA =(List<A>)listb;

listA.add(newB());

正确,但是List<A>= List<B>是错误的,这两个类型并不具有包含关系,他们是两个各自独立的类型,就像本文6中所说的那样



  1. 泛型+方法

    private<T> void Test(T a){}

    此时在方法Test中,T即被当做一个普通类型来使用



当方法有多个参数的时候,且参数之间的类型有着关系,这时候需要使用<?>通配符来表达

<T> void eat(List<? extends T> a,List<T> b){System.out.println("eat");}public static void main(String[] args) {Test test = new Test();test.eat(new ArrayList<B>(), new ArrayList<A>());}



  1. 泛型+构造器(可以理解构造器是类的一种特殊方法,与普通方法的有点区别)

public <T> Test(T t) {}<E> void eat(E e){}public static void main(String[] args) {String t = "test";Test test = new Test(t);Test test1 = new <A>Test(new A());test.eat(t);test1.<A>eat(new A());}

         可以看到基本功能一样,调用的时候都可以选择指定或者不指定<T>泛型的具体类型


  1. 小知识:

    List<>= List //调用不当(List实际存储的类型与<>中的不匹配)的时候会导致异常

          List= List<> //丢失TYPE,直接变成List的上限


0 0
原创粉丝点击