java 泛型<E>类 简解

创建ArrayList类时不理解new ArrayList<Integer> 中< Integer >的内部原理?
刚开始读源码时public class ArrayList<E>搞不清楚E是什么语法?
这篇文章会做一个初步的解释。

“E”是什么

如果把java的类看做数学公式,E就相当于未知数x。它可以贯穿于整个公式中。不同的是,它不需要求解,因为这是使用者自己设定值的。

什么情况下使用

我需要一个方法,它可以传入任意类型的对象,并且返回这个类型的对象。根据”所有java类都是Object的子类“,我们可以这么写。

    public static void main(String[] args) {
        String str = (String) getObj("1");
    }

    public static Object getObj(Object obj){
        return obj;
    }

这不是一个好的写法,多余的强制类型转换应该被避免。不光写着烦,还可能出现bug。关键是泛型机制可以很好地避免这种情况。

怎么创建带有泛型的类

基本格式

public class NayiList<E> {
}

这个”E“可以用在这个类的任何地方。

public class NayiList<E> {

    private E element;

    public NayiList(E element){
        this.element = element;
    }

    public E getElement(){
        return this.element;
    }

    class InnerNayiList<E> extends NayiList<E>{

        E inner;

        public InnerNayiList(E element) {
            super(element);
            this.inner = element;
        }

        public E getElement(){
            return null;
        }

    }

}

这个泛型可以定义多个,并且在语法上可以任意取名,只不过一般会用单个大写字母。特别的,如果泛型名字与其他类重名,编译器会在整个类中默认使用泛型。非泛型的需要指定完整路径。

public class NayiList<Nayi, String> {

    private Nayi element;

    public NayiList(Nayi element){
        this.element = element;
    }

    public Nayi getElement(){
        return this.element;
    }

    public String getGenericObj(){
        return null;
    }

    public java.lang.String getObjectObj(){
        return "str";
    }

    public static void main(java.lang.String[] args) {
        NayiList<Double, Integer> nayi = new NayiList<Double, Integer>(0.1);
        Integer dObj = nayi.getGenericObj();
        java.lang.String str = nayi.getObjectObj();

        System.out.println(dObj);
        System.out.println(str);
    }

}

代码非常混乱,不建议这样写。

<E extends ArrayList><E super ArrayList>

规定了泛型的上下边界。含义完全就是字面意思,不做过多解释。

如果想学习更成熟的用法,可以看看java中各种集合类的源码。

猜你喜欢

转载自blog.csdn.net/nayi_224/article/details/80268276