作者:手机用户2502937767 | 来源:互联网 | 2022-12-10 14:30
有没有人有关于此代码在java 8上工作但在java 9上不工作的原因的见解
String[] strings = (String[]) Arrays.asList("foo", "bar").toArray();
for (String string : strings) {
System.out.println(string);
}
我知道我们可以在执行toArray时指定类型而不是强制转换它.但是我在调试我们的一个依赖项时发现了这个问题(hive-metastore-2.1.1 HiveMetaStoreClient第274行).所以我没有自由改变代码,我们正在运行java 9.有没有办法解决这个问题?这是java 9的一个问题(因为它似乎是一个突破性的变化)或只是在hive repo中提交一个bug.
1> JakeM..:
好像它可能是由于更改(coll)Arrays.asList(x).toArray().getClass()应该是Object [] .class
看起来他们修复了一个错误,即toArray可以返回除Object之外的类型.
引用发行说明
这可能会导致期望旧行为失败ClassCastException
的代码...如果出现此问题,请重写代码以使用one-arg表单toArray(T[])
,并提供所需数组类型的实例.这也将消除演员阵容的需要.
因此,您似乎需要在Hive仓库中提交一个错误,以便在此更改后更新代码.
看起来他们实际上在未来的提交中添加了一个配置值,如果设置了某个值,实际上会避免导致问题的代码路径.
https://github.com/apache/hive/commit/07492e0d2f1942c1794a3190610e10207c850cf7#diff-ca39aa4869cc58909a31c761cd7a27ccR257
也许您可以升级到具有此功能的版本并使用此配置来避免此问题.只要您不关心需要该代码路径的功能.似乎导致问题的代码是选择随机使用哪个URI而不是从列表中选择第一个URI.
2> Radiodef..:
的实现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);
}
不过要清楚一点,在Java 8中,强制转换仅能起作用,因为支持数组最初是String[]
由asList
varargs 创建的。隐含地发生了所有事情new String[] {"foo", "bar"}.clone()
,但是该数组通过了asList
List
实现。
至于修复损坏的依赖关系,除了使用Java 8运行时环境或重写该提交中引入的内容外,我认为没有其他方法。提交错误报告似乎是正确的事情。