在Java5中,引入了Generics(泛型、参数化类型)的概念。泛型允许编写可作用于任意类型的类,但直到声明类的实例时,才指定特定的类型。因为此类型不是作为类定义的一部分而指定的,所以该类成为一般的、获得对任意指定的类型起作用的能力。这个概念应该偷师于.Net。
下面通过集合类的使用展示一下泛型的优点:
List list = new ArrayList(); List<integer> list = new ArrayList<integer>();</integer></integer>
list.add(Integer.valueOf(1)); list.add(Integer.valueOf(1));
list.add(Integer.valueOf(2)); list.add(Integer.valueOf(2));
for(int i=0;i<list.size();i++) for(int i=0;i<list.size();i++) Integer myInteger = (Integer)list.get(i); Integer myInteger = list.get(i);
System.out.println(myInteger.intValue()); System.out.println(myInteger.intValue());
} }
上面红色部分的代码是Java5以前的代码,蓝色是Java5以后的代码,通过对比会发现,在Java5以后 ,泛型给Java增加了额外的安全性,因此在访问元素时也不再需要进行强制类型转换。同时使程序具有可读性。当然上面的程序如果利用增强的for循环、自动装箱/拆卸机制,代码将更优雅。但这是通过编译器完成的,下面通过代码进行证明:
interface Animal{ public class Dog implements Animal{
public void walk(); public void walk() {
System.out.println("四条腿走路");
}
} }
public class Test {
public static <t> void walk(T animal){
animal.draw();//将发生编译错误,如果修改为:animal.toString();代码将正常。
}
}
通过上面的代码,发现实际参数化类型最终会变成Object类型。这导致了一个问题:Java是强类型语言,而泛型阻碍了强类型化。有点前后不一致的感觉,但这也是为了程序的可移植性。相信伴随着Java的开源、发展,这些问题将会得到解决。</t>
下面通过集合类的使用展示一下泛型的优点:
List list = new ArrayList(); List<integer> list = new ArrayList<integer>();</integer></integer>
list.add(Integer.valueOf(1)); list.add(Integer.valueOf(1));
list.add(Integer.valueOf(2)); list.add(Integer.valueOf(2));
for(int i=0;i<list.size();i++) for(int i=0;i<list.size();i++) Integer myInteger = (Integer)list.get(i); Integer myInteger = list.get(i);
System.out.println(myInteger.intValue()); System.out.println(myInteger.intValue());
} }
上面红色部分的代码是Java5以前的代码,蓝色是Java5以后的代码,通过对比会发现,在Java5以后 ,泛型给Java增加了额外的安全性,因此在访问元素时也不再需要进行强制类型转换。同时使程序具有可读性。当然上面的程序如果利用增强的for循环、自动装箱/拆卸机制,代码将更优雅。但这是通过编译器完成的,下面通过代码进行证明:
interface Animal{ public class Dog implements Animal{
public void walk(); public void walk() {
System.out.println("四条腿走路");
}
} }
public class Test {
public static <t> void walk(T animal){
animal.draw();//将发生编译错误,如果修改为:animal.toString();代码将正常。
}
}
通过上面的代码,发现实际参数化类型最终会变成Object类型。这导致了一个问题:Java是强类型语言,而泛型阻碍了强类型化。有点前后不一致的感觉,但这也是为了程序的可移植性。相信伴随着Java的开源、发展,这些问题将会得到解决。</t>