数组强制转换Java8与Java9

数组强制转换Java8与Java9,java,arrays,collections,hive,java-9,Java,Arrays,Collections,Hive,Java 9,有人知道为什么这段代码可以在Java8上工作而不能在Java9上工作吗 String[] strings = (String[]) Arrays.asList("foo", "bar").toArray(); for (String string : strings) { System.out.println(string); } 我知道我们可以在执行toArray而不是强制转换时指定类型。但我在调试我们的一个(hive-metastore-2.1.1 HiveMetaStoreCli

有人知道为什么这段代码可以在Java8上工作而不能在Java9上工作吗

String[] strings = (String[]) Arrays.asList("foo", "bar").toArray();
for (String string : strings) {
    System.out.println(string);
}

我知道我们可以在执行toArray而不是强制转换时指定类型。但我在调试我们的一个(hive-metastore-2.1.1 HiveMetaStoreClient行274)时发现了这个问题。所以我没有修改代码的自由,我们正在运行Java9。有没有办法绕过这个问题?这是java 9的一个问题(因为它看起来像是一个突破性的更改)还是只是在配置单元报告中提交了一个bug。

阵列.ArrayList.toArray的实现似乎已经更改。:

:

不过,需要明确的是,在Java8中,强制转换只起作用,因为支持数组最初是由
asList
varargs创建的
String[]
。隐式地说,所有发生的事情都是
新字符串[]{“foo”,“bar”}.clone()
,但是数组是通过
asList
List
实现传递的



至于修复损坏的依赖关系,我认为除了使用Java8运行时环境或重写提交中引入的内容之外,没有其他方法。提交错误报告似乎是正确的做法。

似乎这可能是由于更改

看起来他们修复了toArray可能返回对象以外类型的错误

引用发行说明

这可能会导致预期旧行为失败的代码出现
ClassCastException
…如果出现此问题,请重写代码以使用one-arg表单
toArray(T[])
,并提供所需数组类型的实例。这也将消除铸造的需要

因此,您似乎需要在配置单元repo中提交一个bug,以更新代码,使其在该更改后工作

看起来他们实际上在将来的提交中添加了一个配置值,如果使用某个值进行设置,实际上可以避免导致问题的代码路径。

也许您可以升级到具有此功能的版本,并使用此配置来避免此问题。只要您不关心需要该代码路径的功能。似乎导致问题的代码是随机选择要使用的URI,而不是从列表中选择第一个。

另请参阅no-arg
toArray()
被定义为返回
对象[]
,因此将其向下转换为
字符串[]
是不正确的。代码在JDK 8中“工作”的事实是一个bug。规范在JDK 10中进行了澄清;看见同时,获取字符串数组的最佳方法如下:
string[]strings=Arrays.asList(“foo”、“bar”).toArray(新字符串[0])
private final E[] a;

ArrayList(E[] array) {
    a = Objects.requireNonNull(array);
}

@Override
public Object[] toArray() {
    return a.clone();
}
@Override
public Object[] toArray() {
    return Arrays.copyOf(a, a.length, Object[].class);
}