有人对此代码为何能在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的问题(因为它似乎是一项重大更改),还是只是在配置单元回购中提交了一个错误。
答案 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运行时环境或重写该提交中引入的内容外,我认为没有其他方法。提交错误报告似乎是正确的事情。