From b119a7a219110df87bb769d10017f05ac0721bd8 Mon Sep 17 00:00:00 2001 From: emptypoint <1215582715@qq.com> Date: Fri, 18 Nov 2022 23:32:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DArrayUtil.insert()=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=93=8D=E4=BD=9C=E5=8E=9F=E5=A7=8B=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E9=97=AE=E9=A2=98;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/ArrayUtil.java | 11 ++++++++-- .../cn/hutool/core/util/ArrayUtilTest.java | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index 4475771a3..0de0859b2 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -477,9 +477,16 @@ public class ArrayUtil extends PrimitiveArrayUtil { index = (index % len) + len; } - final Object result = Array.newInstance(array.getClass().getComponentType(), Math.max(len, index) + newElements.length); + // 已有数组的元素类型 + Class originComponentType = array.getClass().getComponentType(); + Object newEleArr = newElements; + // 如果 已有数组的元素类型是 原始类型,则需要转换 新元素数组 为该类型,避免ArrayStoreException + if (originComponentType.isPrimitive()) { + newEleArr = Convert.convert(array.getClass(), newElements); + } + final Object result = Array.newInstance(originComponentType, Math.max(len, index) + newElements.length); System.arraycopy(array, 0, result, 0, Math.min(len, index)); - System.arraycopy(newElements, 0, result, index, newElements.length); + System.arraycopy(newEleArr, 0, result, index, newElements.length); if (index < len) { System.arraycopy(array, index, result, index + newElements.length, len - index); } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java index ca992b7ca..9bcacf38e 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java @@ -577,4 +577,25 @@ public class ArrayUtilTest { a = null; Assert.assertTrue(ArrayUtil.isAllNull(a)); } + + @Test + public void testInsertPrimitive() { + final boolean[] booleans = new boolean[10]; + final byte[] bytes = new byte[10]; + final char[] chars = new char[10]; + final short[] shorts = new short[10]; + final int[] ints = new int[10]; + final long[] longs = new long[10]; + final float[] floats = new float[10]; + final double[] doubles = new double[10]; + + boolean[] insert1 = ArrayUtil.insert(booleans, 0, 0, 1, 2); + byte[] insert2 = ArrayUtil.insert(bytes, 0, 1, 2, 3); + char[] insert3 = ArrayUtil.insert(chars, 0, 1, 2, 3); + short[] insert4 = ArrayUtil.insert(shorts, 0, 1, 2, 3); + int[] insert5 = ArrayUtil.insert(ints, 0, 1, 2, 3); + long[] insert6 = ArrayUtil.insert(longs, 0, 1, 2, 3); + float[] insert7 = ArrayUtil.insert(floats, 0, 1, 2, 3); + double[] insert8 = ArrayUtil.insert(doubles, 0, 1, 2, 3); + } }