首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java / Generics / Array问题

Java / Generics / Array问题
EN

Stack Overflow用户
提问于 2016-02-08 12:37:01
回答 5查看 117关注 0票数 2

最后,我想了解泛型和数组之间的关系,因此我将根据一个ArrayList<T>提供一个不适合我的示例:

代码语言:javascript
复制
Object[] elementData = new Object[size];

这是存储泛型列表元素的地方。

代码语言:javascript
复制
public void add(T element){ elementData[size++] = element; }

public T get(int index) { return (T)elementData[index] }

完全有效。我可以获取底层的<T>对象,但是包含对这些对象的引用的数组是Object

与此形成对比的是

代码语言:javascript
复制
public Object[] toArray()
{       
    Object[] result = new Object[size];

    for(int i = 0;i<size;i++)
    {
        result[i] = elementData[i];
    }

    return result;
}

我不能将返回数组中的元素转换为它们的真实类型,但是整个设置是相同的:一个包含对Object对象的引用的<T>数组。当试图将元素转换为它们的真实类型时,我得到了ClassCastException错误。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-02-08 12:49:47

如果查看Collection接口,就会发现有两个toArray()方法:

  • Object[] toArray() 返回包含此集合中所有元素的数组。
  • <T> T[] toArray(T[] a) 返回包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

其原因是您不能生成泛型数组,因此只能返回一个Object[]。

创建toArray()的通用方法很简单:

代码语言:javascript
复制
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;
}
票数 3
EN

Stack Overflow用户

发布于 2016-02-11 00:28:51

数组在运行时知道它们的组件类型。因此,要创建数组,需要在运行时提供组件类型。但是,在您的示例中,您在运行时不了解T。因此,您不能创建真正的T[]。您只能返回Object[],或者依赖于某个人给您提供可以在运行时获取T类型的东西。

票数 1
EN

Stack Overflow用户

发布于 2016-02-08 12:47:08

您可以将返回数组中的元素转换为它们的真实类型。但不能将数组转换为T

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35269861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档