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;
    }

}

 

 这里就简单介绍比较常见的泛型使用。下一篇会对泛型通配符,边界等内容进行说明。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2021-06-26 21:16  长江同学  阅读(627)  评论(0编辑  收藏  举报