数组转换java 8与java 9

tnkciper  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(490)

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

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

我知道我们可以在执行toarray时指定类型,而不是强制转换它。但是我在调试一个依赖项(hive-metastore-2.1.1hivemetastoreclient行274)时发现了这个问题。所以我没有修改代码的自由,我们正在运行Java9。有办法解决这个问题吗?这是Java9的一个问题(因为它看起来像一个突破性的改变)还是仅仅在HiveRepo中提交一个bug。

g2ieeal7

g2ieeal71#

实施 Arrays.ArrayList.toArray 好像变了。旧的实现只是 clone 背景阵列:

private final E[] a;

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

@Override
public Object[] toArray() {
    return a.clone();
}

新的实现强制返回的数组为 Object[] :

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

不过,要清楚的是,在Java8中,cast只起作用,因为backing数组最初是一个 String[] ,由 asList 瓦拉格斯。暗中发生的一切 new String[] {"foo", "bar"}.clone() ,但数组通过
asList List 实施。
至于修复损坏的依赖关系,我认为除了使用java8运行时环境或重写提交中引入的内容之外,没有其他方法。提交错误报告似乎是正确的做法。

eoxn13cs

eoxn13cs2#

似乎这可能是由于更改(coll)数组所致。aslist(x).toarray().getclass()应该是object[].class
看起来他们修复了一个toarray可以返回object以外的类型的bug。
引用发行说明
这可能会导致预期旧行为失败的代码出现错误 ClassCastException …如果出现此问题,请重写代码以使用one arg形式 toArray(T[]) ,并提供所需数组类型的示例。这也将消除对演员的需要。
因此,您似乎需要在hiverepo中提交一个bug来更新代码,使其在这次更改后工作。
看起来他们实际上在将来的提交中添加了一个配置值,如果设置了某个值,实际上可以避免导致问题的代码路径。https://github.com/apache/hive/commit/07492e0d2f1942c1794a3190610e10207c850cf7#diff-ca39aa4869cc58909a31c761cd7a27ccr257型
也许你可以升级到一个版本,使用这个配置来避免这个问题。只要您不关心需要该代码路径的功能。似乎导致问题的代码是随机选择要使用的uri,而不是从列表中选择第一个uri。

相关问题