当前位置: 首页 > 面试题库 >

为什么Collection.toArray(T [])不使用E []代替

鞠泰平
2023-03-14
问题内容

toArray方法(可以接在执行java.util.ArrayList)如下:

class ArrayList<E> ....{
    public <T> T[] toArray(T[] a){
        if(a.length < size)
            return (T[]) Arrays.copyof(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if(a.length > size)
            a[size] = null;
        return a;
    }    
}

我想知道在这种情况下我们可以<E>代替使用<T>吗?喜欢

public E[] toArray(E[] a){
      if(a.length < size)
             return (E[]) Arrays.copyof(elementData, size, a.getClass());
      System.arraycopy(elementData, 0, a, 0, size);
      if(a.length > size)
            a[size] = null;
      return a;
}

既然ArrayList类iteself已经是通用的<E>,那么我们可以使用它代替新的通用类型<T>吗?


问题答案:

的要点<T>是,如果所需的数组是的基类E。例如,如果E为,HashMap但所需的数组为Map[]。如果toArray被锁定到E这是不可能的。

由于类型擦除,在通用集合/类型中不需要这种类型的东西。但是数组没有类型擦除,因此数组的类型非常重要。



 类似资料:
  • 问题内容: 我遇到了像这样的Java代码: 以上三种之间的区别是什么?它们在Java中如何称呼这种类型的类或接口声明? 问题答案: 好吧,前两个没有什么区别-它们只是为 type参数 (或)使用了不同的名称。 第三个不是有效的声明- 用作提供类型实 参 时使用的 通配符 ,例如,意味着引用某种类型的列表,但我们不知道是什么。 __ 所有这些都是 泛型 ,这是一个很大的话题。您可能希望通过以下资源了

  • 我正在使用VS2022,。NET 6,C#10,在项目范围内启用了可为空上下文。 变量正在解析为可为空的类型

  • 根据java doc for toArray()返回一个包含该集合中所有元素的数组。 和toArray(对象obj[])。返回包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时间类型。 第一到Array()我理解,但第二到Array(Object obj[])我无法理解。请用例子解释。

  • 问题内容: 是否要保持与旧版本(未生成)的向后兼容性?还是我缺少一个更微妙的细节?我在()中也看到了这种模式,但是归纳为。 问题答案: 之所以使用,是因为它匹配的对象不必与您传递给的对象具有相同的类型;它只要求它们相等。根据规范,如果存在这样的对象,则返回true。请注意,没有什么要求,并且必须是相同的类型。这是因为该方法接受一个as参数,而不仅仅是与该对象相同的类型。 尽管通常已经定义了许多类,

  • 问题内容: 在PHP页面上的表单中,可以使用: 要么 要么 在表单的动作属性中。由于echo 不会传递要使用的变量,而您必须使用,为什么还要使用它呢? 我问是因为我花了一些时间才弄清楚这些变量没有随传递。谢谢。 问题答案: 该属性将默认为当前URL。这是“将表格提交到它来自的地方的最可靠,最简单的方法”。 没有理由使用,并且根本不提交表单(除非附加了事件处理程序来处理提交)。

  • 问题内容: 从Java 6 文档中: 为什么它接受对象而不是通用类型E?唯一可以添加的对象是类型E,因此,唯一的可移动类型应该是类型E。 问题答案: ,如果给定 相等的 元素(根据),则需要工作。在Java中,不同类的对象可能相等(在某些情况下是必需的)。因此,您不应限制类型。