作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想最终理解泛型和数组之间的关系,所以我将提供一个对我来说不一致的例子,基于 ArrayList<T>
:
Object[] elementData = new Object[size];
这是存储通用列表元素的地方。
public void add(T element){ elementData[size++] = element; }
public T get(int index) { return (T)elementData[index] }
完全有效。我可以弄出底层<T>
对象,但是包含对这些对象的引用的数组是 Object
.
与此相反:
public Object[] toArray()
{
Object[] result = new Object[size];
for(int i = 0;i<size;i++)
{
result[i] = elementData[i];
}
return result;
}
我无法将返回数组中的元素转换为它们的真实类型,但是整个设置是相同的:Object
包含对 <T>
的引用的数组对象。我得到了 ClassCastException
尝试将元素转换为其真实类型时出错。
最佳答案
如果您查看 Collection
界面,你看有2个toArray()
方法:
Object[] toArray()
Returns an array containing all of the elements in this collection.
<T> T[] toArray(T[] a)
Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array.
原因是你不能创建通用数组,所以你只能返回一个 Object[]。
为您的 toArray()
制作一个通用方法很简单:
public <T> T[] toArray(T[] arr)
{
T[] result = arr.size == size ? arr : (T[])java.lang.reflect.Array
.newInstance(arr.getClass().getComponentType(), size);
for(int i = 0;i<size;i++)
{
result[i] = elementData[i];
}
return result;
}
关于Java/泛型/数组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35269861/
我是一名优秀的程序员,十分优秀!