数组强制转换Java8与Java9
有人知道为什么这段代码可以在Java8上工作而不能在Java9上工作吗数组强制转换Java8与Java9,java,arrays,collections,hive,java-9,Java,Arrays,Collections,Hive,Java 9,有人知道为什么这段代码可以在Java8上工作而不能在Java9上工作吗 String[] strings = (String[]) Arrays.asList("foo", "bar").toArray(); for (String string : strings) { System.out.println(string); } 我知道我们可以在执行toArray而不是强制转换时指定类型。但我在调试我们的一个(hive-metastore-2.1.1 HiveMetaStoreCli
String[] strings = (String[]) Arrays.asList("foo", "bar").toArray();
for (String string : strings) {
System.out.println(string);
}
我知道我们可以在执行toArray而不是强制转换时指定类型。但我在调试我们的一个(hive-metastore-2.1.1 HiveMetaStoreClient行274)时发现了这个问题。所以我没有修改代码的自由,我们正在运行Java9。有没有办法绕过这个问题?这是java 9的一个问题(因为它看起来像是一个突破性的更改)还是只是在配置单元报告中提交了一个bug。阵列.ArrayList.toArray的实现似乎已经更改。: : 不过,需要明确的是,在Java8中,强制转换只起作用,因为支持数组最初是由
asList
varargs创建的String[]
。隐式地说,所有发生的事情都是新字符串[]{“foo”,“bar”}.clone()
,但是数组是通过asList
List
实现传递的
至于修复损坏的依赖关系,我认为除了使用Java8运行时环境或重写提交中引入的内容之外,没有其他方法。提交错误报告似乎是正确的做法。似乎这可能是由于更改 看起来他们修复了toArray可能返回对象以外类型的错误 引用发行说明 这可能会导致预期旧行为失败的代码出现
ClassCastException
…如果出现此问题,请重写代码以使用one-arg表单toArray(T[])
,并提供所需数组类型的实例。这也将消除铸造的需要
因此,您似乎需要在配置单元repo中提交一个bug,以更新代码,使其在该更改后工作
看起来他们实际上在将来的提交中添加了一个配置值,如果使用某个值进行设置,实际上可以避免导致问题的代码路径。
也许您可以升级到具有此功能的版本,并使用此配置来避免此问题。只要您不关心需要该代码路径的功能。似乎导致问题的代码是随机选择要使用的URI,而不是从列表中选择第一个。另请参阅no-argtoArray()
被定义为返回对象[]
,因此将其向下转换为字符串[]
是不正确的。代码在JDK 8中“工作”的事实是一个bug。规范在JDK 10中进行了澄清;看见同时,获取字符串数组的最佳方法如下:string[]strings=Arrays.asList(“foo”、“bar”).toArray(新字符串[0])
。
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
@Override
public Object[] toArray() {
return a.clone();
}
@Override
public Object[] toArray() {
return Arrays.copyOf(a, a.length, Object[].class);
}