有人知道为什么这段代码可以在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。
2条答案
按热度按时间g2ieeal71#
实施
Arrays.ArrayList.toArray
好像变了。旧的实现只是clone
背景阵列:新的实现强制返回的数组为
Object[]
:不过,要清楚的是,在Java8中,cast只起作用,因为backing数组最初是一个
String[]
,由asList
瓦拉格斯。暗中发生的一切new String[] {"foo", "bar"}.clone()
,但数组通过asList
List
实施。至于修复损坏的依赖关系,我认为除了使用java8运行时环境或重写提交中引入的内容之外,没有其他方法。提交错误报告似乎是正确的做法。
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。