泛型1

面向对象的语言的特性之一是代码的重用,而支持代码重用的一个重要的机制是泛型机制。若是在操做一个方法时能够不去考虑对象的基本类型,方法的内在逻辑相同时能够用泛型实现来描述这个方法。git

一,使用Object表示泛型:可使用像Object这样适当的超类来实现泛型。如:数组

public class Test{对象

  public Object read(){接口

    return storedValue;编译器

  }it

  public void write(Object x){io

    storedValue = x;编译

  }ast

  private Object storedValue;class

}

其中需注意两个细节:1,在使用write方法把一个Object或者其子类写入后,此时用read()方法读出的类型是Object类,若要读出写入的类型或者运用写入类型的方法时则需进行强制转化。2,不能使用基本类型做为参数,由于基本类型与Object类型不能相容,若要使用基本类型,则需使用其包装类。如:

public class TestDemo{

  public static void main( String[  ] args){

    Test test = new Test();

    test.write( new Integer( 18 ) ); 

    Integer digital = ( Integer) test.read();

    int val = digital.intValue();

    System.out,println(" Contents are: " + val );

  }

}

在这个例子中由于在调用write()方法前要先建立Integer对象因此代码写的很麻烦,在Java 5 之前若一个int类型的数据放到须要Integer对象的地方那么编译会出错,而在Java 5 加入的自动装箱和自动拆箱矫正了这个情形,若是将一个基本类型的变量放入须要使用包装类的地方,编译器将自动调用相对应的包装类的构造方法,这就叫作自动装箱。若是将一个包装类插入到须要基本类型的地方,编译器会调用包装类中取出基本类型值的方法,这叫作自动拆箱。(但在对泛型类的实例化时不能使用基本类型。)

代码修改成:

public class TestDemo{

  public static void main( String[  ] args){

    Test test = new Test();

    test.write( 18 );

    System.out,println(" Contents are: " + test.read() );

  }

}

二:使用接口类型表示泛型

通常只有在使用Object这样的超类中所定义的方法能够标示所执行的操做时才使用Object这样的超类做为泛型类型,例如须要在一些项中找出最大项的问题,这与项的类型无关,但它须要一种能力来比较任意两个对象,并能肯定哪一个大哪一个小。可使用compareTo方法。它对全部的Comparable接口都是现成可用的,方法能够写为:

public class FindMaxDemo{

  public static Comparable findMax( Comparable [ ] compare){

    int maxIndex = 0;

    for ( int i = 0 ; i < compare.length; i++ ){

      if (compare[maxIndex].compareTo[i] <  0){

        maxIndex = i;

      }

    }   

    return compare[maxIndex];

  }

}

若是使用这个方法找出最大项时首先须要注意,所传入的数组元素必须实现Comparable接口,即便一个元素具备compareTo方法,但并未实现Comparable接口也不能做为数组元素传入。

其次数组中的对象必须相容,不然compareTo方法会抛出ClassCastException。

注意基本类型不能做为Comparable进行传入,而包装类能够,由于包装类实现了Comparable接口。

注意接口做为泛型时可使用自定义的接口,不必定须要使用标准的接口库。

最后,使用接口表示泛型并不必定老是行得通,例若有的类是库中的类,而接口是自定义的,这时没法宣称该类实现了接口。

相关文章
相关标签/搜索