打字猴:1.700447085e+09
1700447085
1700447086 注意看elementData的定义,它容纳了ArrayList的所有元素,其类型是Object数组,因为Object是所有类的父类,数组又允许协变(Covariant),因此elementData数组可以容纳所有的实例对象。元素加入时向上转型为Object类型(E类型转为Object),取出时向下转型为E类型(Object转为E类型),如此处理而已。
1700447087
1700447088 在某些情况下,我们确实需要泛型数组,那该如何处理呢?代码如下:
1700447089
1700447090 class Foo<T>{
1700447091
1700447092 //不再初始化,由构造函数初始化
1700447093
1700447094 private T t;
1700447095
1700447096 private T[]tArray;
1700447097
1700447098 private List<T>list=new ArrayList<T>();
1700447099
1700447100 //构造函数初始化
1700447101
1700447102 public Foo(){
1700447103
1700447104 try{
1700447105
1700447106 Class<?>tType=Class.forName(””);
1700447107
1700447108 t=(T)tType.newInstance();
1700447109
1700447110 tArray=(T[])Array.newInstance(tType,5);
1700447111
1700447112 }catch(Exception e){
1700447113
1700447114 e.printStackTrace();
1700447115
1700447116 }
1700447117
1700447118 }
1700447119
1700447120 }
1700447121
1700447122 此时,运行就没有任何问题了。剩下的问题就是怎么在运行期获得T的类型,也就是tType参数,一般情况下泛型类型是无法获取的,不过,在客户端调用时多传输一个T类型的class就会解决问题。
1700447123
1700447124 类的成员变量是在类初始化前初始化的,所以要求在初始化前它必须具有明确的类型,否则就只能声明,不能初始化。
1700447125
1700447126
1700447127
1700447128
1700447129 编写高质量代码:改善Java程序的151个建议 [:1700438168]
1700447130 编写高质量代码:改善Java程序的151个建议 建议95:强制声明泛型的实际类型
1700447131
1700447132 Arrays工具类有一个方法asList可以把一个变长参数或数组转变为列表,但是它有一个缺点:它所生成的List长度是不可改变的,而这在我们的项目开发中有时会很不方便。如果你期望生成的列表长度是可变,那就需要自己来写一个数组的工具类了,代码如下:
1700447133
1700447134 class ArrayUtils{
[ 上一页 ]  [ :1.700447085e+09 ]  [ 下一页 ]