数组转换Java 8 vs Java 9

时间:2018-07-17 03:25:24

标签: java arrays collections hive java-9

有人对此代码为何能在Java 8上运行而不是在Java 9上有见解

selected_chart(e) {
    if (e.target.checked) {
        this.c_value = e.target.value;
        this.charts_selected.push(this.c_value);
    }
}

我知道我们可以在执行toArray时指定类型,而不用强制转换。但是我在调​​试我们的dependency(hive-metastore-2.1.1 HiveMetaStoreClient行274)时发现了这个问题。因此,我没有更改代码的自由,我们正在运行Java9。有没有办法解决这个问题?这是Java 9的问题(因为它似乎是一项重大更改),还是只是在配置单元回购中提交了一个错误。

2 个答案:

答案 0 :(得分:10)

好像是由于(coll) Arrays.asList(x).toArray().getClass() should be Object[].class的变化

看起来他们修复了toArray可以返​​回Object以外的类型的错误。

引用发行说明

  

这可能会导致预期旧行为的代码失败并显示ClassCastException ...如果发生此问题,请重写代码以使用单参数形式toArray(T[]),并提供一个实例所需的数组类型。这也将消除对演员表的需要。

因此,您似乎需要在Hive存储库中提交一个错误,才能在更改后更新代码以使其正常工作。

看起来他们实际上在将来的提交中添加了一个配置值,如果将其设置为某个值,则实际上可以避免代码路径引起此问题。 https://github.com/apache/hive/commit/07492e0d2f1942c1794a3190610e10207c850cf7#diff-ca39aa4869cc58909a31c761cd7a27ccR257

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

答案 1 :(得分:5)

Arrays.ArrayList.toArray的实现似乎已更改。 The old implementation was to just clone the backing array

private final E[] a;

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

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

The new implementation forces the returned array to be an Object[]

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

不过,要清楚一点,在Java 8中,强制转换仅能起作用,因为后备数组最初是由String[] varargs创建的asList。隐式发生的只是new String[] {"foo", "bar"}.clone(),但是数组是通过asList List实现传递的。


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