创建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中各种集合类的源码。