事实证明,只要你不太仔细地看,一个JS Int8Array(因此elemental2.core.Int8Array)的行为与GWT/Java byte[]的行为相同-它只包含-127到128之间的值。它将不能正确地转换为byte[],任何调用.getClass()或其他Java方法的东西也不能正常工作。它也不能被转换(通过泛型或显式)为byte[]。 因此,如果你需要把内容当作一个真实的的Java数组,你必须先复制它,你的答案会做你想做的,但它可能是更明确的正确的不是“convert it from Double”的过程沿着:
import elemental2.core.ArrayBuffer;
import elemental2.core.Int8Array;
import jsinterop.base.Js;
public static byte[] toBytes(ArrayBuffer buffer) {
// Use uncheckedCast since we are outright lying to the compiler
byte[] arr = Js.uncheckedCast(new Int8Array(buffer));
byte[] result = new byte[arr.length];
for (int i = 0; i < arr.length; i++) {
result[i] = arr[i];
}
return result;
}
2条答案
按热度按时间bksxznpy1#
事实证明,只要你不太仔细地看,一个JS
Int8Array
(因此elemental2.core.Int8Array
)的行为与GWT/Javabyte[]
的行为相同-它只包含-127到128之间的值。它将不能正确地转换为byte[]
,任何调用.getClass()
或其他Java方法的东西也不能正常工作。它也不能被转换(通过泛型或显式)为byte[]
。因此,如果你需要把内容当作一个真实的的Java数组,你必须先复制它,你的答案会做你想做的,但它可能是更明确的正确的不是“convert it from Double”的过程沿着:
您的解决方案也是正确的-GWT和J2 CL中的
java.lang.Double
与JSNumber类型完全相同,这是Int 8Array在查询其值时返回的值。(可能是通过value & 0xFF
?)的价值,这应该是便宜的,但不是完全免费的。最后,只要你只是把得到的
byte[]
当作一个可以迭代的集合,并且不会以某种方式处理它,以至于实际的类型会被检查,我们就可以完全不复制它:虽然这确实是作弊,而且还有其他的缺点,比如如果原始缓冲区被修改,数组也会被修改,反之亦然。
kmbjn2e32#
以下是我目前的发现: