JDK5引入了泛型,可以在编译期提供类型安全监测。泛型和集合类的结合,是消灭重复代码的一大利器。对于一些通用的逻辑,我们并不关心它的真正类型是什么,只要输入--执行这一逻辑--输出即可满足我们的需求。对于类似的需求,继承和接口都有很大的局限性,于是泛型机制应运而生,它真正做到了类或方法与所使用对象的类型的解耦。泛型可以让参数,在运行中动态地指定为某一种类型。
1.泛型类。泛型类可以在类名后使用尖括号的形式创建。可以指定一个,也可以指定多个类型参数:
public class GenericClassTest { class InnerTestOne<T> { T param; public T getParam() { return param; } public void setParam(T param) { this.param = param; } } class InnerTestTwo<M, N> { M paramOne; N paramTwo; public InnerTestTwo(M paramOne, N paramTwo) { this.paramOne = paramOne; this.paramTwo = paramTwo; } } class InnerTestThree<A, B, C> { A paramOne; B paramTwo; C paramThree; public InnerTestThree(A paramOne, B paramTwo, C paramThree) { this.paramOne = paramOne; this.paramTwo = paramTwo; this.paramThree = paramThree; } } }
具体使用时,直接使用类名<具体类型>即可。如下:
public static void main(String[] args) { new GenericClassTest().new InnerTestOne<String>(); new GenericClassTest().new InnerTestThree<String, Integer, Boolean>("cat", 12, true); }
2.泛型接口与泛型接口的实现,与泛型类的定义类似:
public interface GenericInterfaceTest<T> { void showClass(T t); } public class GenericInterfaceImpl implements GenericInterfaceTest<String> { @Override public void showClass(String s) { System.out.println(s.getClass().getName()); } }
或者可以继续将这个类型放在实现类中:
public class GenericInterfaceImpl<T> implements GenericInterfaceTest<T> { @Override public void showClass(T t) { System.out.println(t.getClass().getName()); } }
3.泛型方法。注意这里指的是在普通类中定义的泛型方法,而不是泛型类或者泛型接口中:
public class GenericMethodTest { public <T> T showSelf(T t) { return t; } public static <M> Method[] showAllMethods(M m) { return m.getClass().getMethods(); } public final <N> String showToString(N n) { return n.toString(); } public <K> Integer showLength(K... k) { return k.length; } }
这里就简单介绍比较常见的泛型使用。下一篇会对泛型通配符,边界等内容进行说明。