面向对象的语言的特性之一是代码的重用,而支持代码重用的一个重要的机制是泛型机制。若是在操做一个方法时能够不去考虑对象的基本类型,方法的内在逻辑相同时能够用泛型实现来描述这个方法。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接口。
注意接口做为泛型时可使用自定义的接口,不必定须要使用标准的接口库。
最后,使用接口表示泛型并不必定老是行得通,例若有的类是库中的类,而接口是自定义的,这时没法宣称该类实现了接口。