使用泛型的好处是:在编译的时候检查类型的使用(转化)是否安全,并且所有转化都是自动和隐式的,以及提高了代码重用性。
- package org.example.fanxing;
- /**
- * DOC 类泛型事例一<br/>
- * 泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
- *
- * @param <T>
- */
- public class SomeThing<T> {
- private T t;
- public SomeThing(T t) {
- this.t = t;
- }
- private void showType() {
- System.out.println(t.getClass().getName());
- }
- private static class Test {
- public static void main(String[] args) {
- new SomeThing("str").showType();
- new SomeThing(100).showType();
- new SomeThing('a').showType();
- // test results:
- /**
- * java.lang.String<br/>
- * java.lang.Integer<br/>
- * java.lang.Character
- */
- }
- }
- }
- package org.example.fanxing;
- /**
- *
- * DOC 泛型示例2<br/>
- * 假设要重构两个类,这两个类的变量和方法都一样,就是类型不一样,如StringSub和IntSub<br/>
- * 现在重构这两个类,只要使用泛型就可以了
- *
- */
- public class ObjectFanXing<T> {
- private T a;
- public ObjectFanXing(T t) {
- this.a = t;
- }
- public T getA() {
- return this.a;
- }
- public void setA(T t) {
- this.a = t;
- }
- private static class Test {
- public static void main(String[] args) {
- System.out.println("string.getA=" + new ObjectFanXing<String>("str").getA());
- System.out.println("double.getA=" + new ObjectFanXing<Double>(12.2222335).getA());
- System.out.println("object.getA=" + new ObjectFanXing<Object>(new Object()).getA());
- // test results:
- /**
- * string.getA=str<br/>
- * double.getA=12.2222335<br/>
- * object.getA=java.lang.Object@dc8569
- */
- }
- }
- /**
- * private class StringSub {
- *
- * String a;
- *
- * public String getA() { return this.a; }
- *
- * public void setA(String a) { this.a = a; }
- *
- * }
- *
- * private class IntSub {
- *
- * private Integer a;
- *
- * public Integer getA() { return this.a; }
- *
- * public void setA(Integer a) { this.a = a; } }
- */
- }
- package org.example.fanxing;
- import java.util.ArrayList;
- import java.util.Collection;
- /**
- *
- * DOC 泛型示例3<br/>
- * 带限制的泛型,可以限制传入的泛型为某个类的子类,或者实现了某个接口的类 <br/>
- * ? 表示通用泛型<br/>
- * 如果只指定了<?>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。<br/>
- * 通配符泛型不单可以向下限制,如<? extends Collection>,还可以向上限制,如<? super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。
- *
- *
- */
- public class LimitFanxing<T extends Collection> {
- private T t;
- public LimitFanxing(T t) {
- this.t = t;
- }
- public T getT() {
- return this.t;
- }
- public void setT(T t) {
- this.t = t;
- }
- public static class Test {
- public static void main(String[] args) {
- LimitFanxing<ArrayList> fanxing = new LimitFanxing<ArrayList>(new ArrayList());
- LimitFanxing<? extends Collection> fanxing2 = new LimitFanxing<ArrayList>(new ArrayList());
- }
- }
- }