Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么ArrayList.toArray方法传递数组参数而不是数组类参数?;_Java - Fatal编程技术网

Java 为什么ArrayList.toArray方法传递数组参数而不是数组类参数?;

Java 为什么ArrayList.toArray方法传递数组参数而不是数组类参数?;,java,Java,这里有一个ArrayList列表,我想把它转换成一个带有字符串[]的数组 因此,我检查了ArrayListAPI,得到了一个方法toArray(T[]a),这是唯一一个具有泛型类型的方法 我想知道为什么ArrayList没有下面这样的方法 public <T> T[] toArray(Class<T[]> type) { return Arrays.copyOf(elementData, size, type); } public T[]toArray(类类型)

这里有一个ArrayList
列表
,我想把它转换成一个带有
字符串[]的数组

因此,我检查了
ArrayList
API,得到了一个方法
toArray(T[]a)
,这是唯一一个具有泛型类型的方法

我想知道为什么
ArrayList
没有下面这样的方法

public <T> T[] toArray(Class<T[]> type) {
    return Arrays.copyOf(elementData, size, type);
}
public T[]toArray(类类型){
返回数组.copyOf(elementData,size,type);
}
因此,我将其称为
list.toArray(String[].class)
,而不创建新数组。我试过了,我觉得更简单

当然,也许我没有得到作者关于
ArrayList.toArray
的想法

因此,我想请大家指出我的错误,或者与我分享一下原始方法toArray(T[]a)的优点。谢谢!:)

如果您指的是
java.util.ArrayList.class
。它实际上有一个功能

在内部,函数正在执行与您相同的操作。这有什么不对

public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
}
public T[]toArray(T[]a){
如果(a.长度<尺寸)
//创建a的运行时类型的新数组,但我的内容:
return(T[])array.copyOf(elementData,size,a.getClass());
System.arraycopy(elementData,0,a,0,size);
如果(a.长度>尺寸)
a[size]=null;
返回a;
}
如果您指的是
java.util.ArrayList.class
。它实际上有一个功能

在内部,函数正在执行与您相同的操作。这有什么不对

public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
}
public T[]toArray(T[]a){
如果(a.长度<尺寸)
//创建a的运行时类型的新数组,但我的内容:
return(T[])array.copyOf(elementData,size,a.getClass());
System.arraycopy(elementData,0,a,0,size);
如果(a.长度>尺寸)
a[size]=null;
返回a;
}

因为该方法早于泛型

在Java 1.2中,当创建该方法时,它被声明为:

public Object[] toArray(Object[] a)
然后调用方可以创建正确类型的数组,例如
String[]
,并强制转换返回值。如果阵列的大小足够大,则不需要反射来重新调整阵列的大小,因此性能更好

从那时起,Java的性能状况发生了巨大的变化,因此,在设计过程中所做的一些性能考虑现在似乎是不必要的

设计者还添加了一个奇怪的C类怪癖,即如果数组过大,则在列表中最后一个元素之后立即对元素执行
null
。如果这种方法是在这些天设计出来的,我怀疑这种情况会发生

在Java5中添加泛型时,一些类被更改为泛型,例如所有集合类,并且所有现有方法都被尽可能地更改以适应这种情况。某些方法可以更改以实现向后兼容性,例如,
Map.get(Object key)
未更改为
Map.get(K key)
,因为以前使用不在映射中的对象调用
get()
是有效的

toArray
方法已更改,因为即使更改,它仍保持完全向后兼容:

public <T> T[] toArray(T[] a)
public T[]toArray(T[]a)

因为该方法早于泛型

在Java 1.2中,当创建该方法时,它被声明为:

public Object[] toArray(Object[] a)
然后调用方可以创建正确类型的数组,例如
String[]
,并强制转换返回值。如果阵列的大小足够大,则不需要反射来重新调整阵列的大小,因此性能更好

从那时起,Java的性能状况发生了巨大的变化,因此,在设计过程中所做的一些性能考虑现在似乎是不必要的

设计者还添加了一个奇怪的C类怪癖,即如果数组过大,则在列表中最后一个元素之后立即对元素执行
null
。如果这种方法是在这些天设计出来的,我怀疑这种情况会发生

在Java5中添加泛型时,一些类被更改为泛型,例如所有集合类,并且所有现有方法都被尽可能地更改以适应这种情况。某些方法可以更改以实现向后兼容性,例如,
Map.get(Object key)
未更改为
Map.get(K key)
,因为以前使用不在映射中的对象调用
get()
是有效的

toArray
方法已更改,因为即使更改,它仍保持完全向后兼容:

public <T> T[] toArray(T[] a)
public T[]toArray(T[]a)

因为
Class
将是数组(即Java数组是它自己的类型),在类型擦除之后,
T[]
将是
Object[]
。你为什么想要一个
列表中的
字符串[]
?@Elliott Frisch抱歉,我刚才没有看到你的答复。这是我的错。我试着回答我的问题。它可以工作,我得到一个类型为
String[]
而不是
Object[]
的结果。这里没有类型擦除吗?我confuesed@ElliottFrisch告诉我为什么我想要一个
列表中的
字符串[]
,只是因为我想调用第三方api,它需要一个
数组,而不是
列表
。所以我需要转换它。这就是全部……因为
Class
将是数组(即Java数组是它自己的类型),在类型擦除之后,
T[]
将是
Object[]
。你为什么想要一个
列表中的
字符串[]
?@Elliott Frisch抱歉,我刚才没有看到你的答复。这是我的错。我试着回答我的问题。它可以工作,我得到一个类型为
String[]
而不是
Object[]
的结果。这里没有类型擦除吗?我confuesed@ElliottFrisch关于我为什么希望从<