Fel*_*lix 44 java java-8 java-9
为什么以下条件返回trueJDK 8,而它返回falseJDK 9?
String[].class == Arrays.asList("a", "b").toArray().getClass()
Run Code Online (Sandbox Code Playgroud)
Jor*_*nee 51
List返回的类型asList是Arrays$ArrayList.在toArray对类在JDK 8的方法是:
@Override
public Object[] toArray() {
return a.clone();
}
Run Code Online (Sandbox Code Playgroud)
但在JDK 9+中它是:
@Override
public Object[] toArray() {
return Arrays.copyOf(a, a.length, Object[].class);
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下String[]都传递给a asList,但是在JDK 8的情况下它被克隆,它保留了它的数组类型(String[]),而在JDK 9+中它使用Arrays.copyOf显式的新数组类型复制Object[].
这种差异意味着在JDK 8中Arrays.asList("a", "b").toArray().getClass()返回String[]并在JDK 9+中返回Object[],因此在JDK 9+中,您的表达式将评估为false.
这种变化的原因来自JDK-6260652,其动机如下:
Collection文档声称
Run Code Online (Sandbox Code Playgroud)collection.toArray()是"功能相同"
Run Code Online (Sandbox Code Playgroud)collection.toArray(new Object[0]);但是,实现
Arrays.asList并不遵循:如果使用子类型数组(例如String[])创建,toArray()它将返回相同类型的数组(因为它使用clone())而不是Object[].如果后来尝试在该数组中存储非字符串(或其他),
ArrayStoreException则抛出一个.
所以这个改变是为了修复以前的行为.
如果这对您来说是一个问题,相关的发行说明提供了解决此问题的方法:
如果出现此问题,请重写代码以使用one-arg表单
toArray(T[]),并提供所需数组类型的实例.这也将消除演员阵容的需要.Run Code Online (Sandbox Code Playgroud)String[] array = list.toArray(new String[0]);
Tho*_*ger 12
我会说这是JDK 8中的一个错误,在此之前已经修复了.
List<T>.toArray()总是被声明为返回Object[](参见JavaDoc) - 它String[]在特殊情况下实际返回是一个错误.
| 归档时间: |
|
| 查看次数: |
1434 次 |
| 最近记录: |