今天发现一段源码,大概是这个样子的:
1 | List<Method> methods = new ArrayList(); |
我明白大致意思应该是要通过一个Collection
集合返回一个Method
类型的数,但是下面的几个问题不禁让我思考。
为什么要传入一个new Method[0]
这样长度为0的数组
Collection
类中有两个 toArray
方法
1 | Object[] toArray(); |
从方法签名可以看出第一个方法是返回Object
类型的数组,而第二个方法返回泛型数组。
也就是说 T[] a
的作用仅仅是规定返回类型?
如果只是返回泛型的话为什么不直接 <T> T[] toArray(Class<T> clazz);
先查看ArrayList
的源码:
1 | public <T> T[] toArray(T[] a) { |
原来这个方法还能将数据传入指定数组中。
而当数组长度不够时,这个方法的作用仅仅是返回一个泛型数组。因此传入一个 new Method[0]
仅仅是规定了泛型,而且长度为0的数组还能够节省空间。
解决了这个问题,不禁又想到另一个问题。
Object[] toArray() 为什么不返回泛型
当 ArrayList
未传入泛型时,无法确定 elementData
数组的类型,从而无法定义数组,因此 ArrayList
中的 elementData
只能为 Object
类型的数组。
Object
类型的数据可以直接强转为 泛型 T
,但是 Object[]
数组却无法直接强转为泛型 T[]
数组。
而 ArrayList
中的 toArray
方法并没有对 Object[]
数组做特殊处理,而是直接复制一份Object
数组返回给我们,让我们自己对数组进行处理。