This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-lang.git
commit 8ae6a3925ab3bcfa0450b9aa92f4d00693b4c8d2 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Tue May 25 10:18:47 2021 -0400 Add and use ArrayUtils.newInstance(Class<T>, int). --- src/changes/changes.xml | 3 +- .../java/org/apache/commons/lang3/ArrayUtils.java | 32 ++++++++++++++-------- .../java/org/apache/commons/lang3/Streams.java | 4 +-- .../commons/lang3/event/EventListenerSupport.java | 5 ++-- .../org/apache/commons/lang3/stream/Streams.java | 6 ++-- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 32c1a2e..e2b73e5 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -56,8 +56,9 @@ The <action> type attribute can be add,update,fix,remove. <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use EnumUtils.getFirstEnumIgnoreCase(Class, String, Function, E).</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use Suppliers.</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use ArrayUtils.getComponentType(T[]).</action> - <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use ClassUtils.getComponentType(Class<T[]>).</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use ClassUtils.getComponentType(Class>T[]>).</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use ObjectUtils.getClass(T).</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use ArrayUtils.newInstance(Class>T>, int).</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">Bump spotbugs-maven-plugin from 4.2.0 to 4.2.3 #735.</action> <action type="update" dev="ggregory" due-to="Dependabot, XenoAmess">Bump Bump actions/cache from v2.1.4 to v2.1.5 #742, #752.</action> diff --git a/src/main/java/org/apache/commons/lang3/ArrayUtils.java b/src/main/java/org/apache/commons/lang3/ArrayUtils.java index 69ccfcb..9404cff 100644 --- a/src/main/java/org/apache/commons/lang3/ArrayUtils.java +++ b/src/main/java/org/apache/commons/lang3/ArrayUtils.java @@ -1082,9 +1082,8 @@ public class ArrayUtils { if (array2 == null) { return clone(array1); } - final Class<?> type1 = array1.getClass().getComponentType(); - @SuppressWarnings("unchecked") // OK, because array is of type T - final T[] joinedArray = (T[]) Array.newInstance(type1, array1.length + array2.length); + final Class<T> type1 = getComponentType(array1); + final T[] joinedArray = newInstance(type1, array1.length + array2.length); System.arraycopy(array1, 0, joinedArray, 0, array1.length); try { System.arraycopy(array2, 0, joinedArray, array1.length, array2.length); @@ -3113,9 +3112,8 @@ public static int indexOf(final int[] array, final int valueToFind, int startInd } final Class<T> type = getComponentType(array); - @SuppressWarnings("unchecked") // OK, because array and values are of type T - final - T[] result = (T[]) Array.newInstance(type, array.length + values.length); + final int length = array.length + values.length; + final T[] result = newInstance(type, length); System.arraycopy(values, 0, result, index, values.length); if (index > 0) { @@ -4217,6 +4215,20 @@ public static int indexOf(final int[] array, final int valueToFind, int startInd } /** + * Delegates to {@link Array#newInstance(Class,int)} using generics. + * + * @param <T> The array type. + * @param type The array class. + * @param length the array length + * @return The new array. + * @since 3.13.0 + */ + @SuppressWarnings("unchecked") // OK, because array and values are of type T + public static <T> T[] newInstance(final Class<T> type, final int length) { + return (T[]) Array.newInstance(type, length); + } + + /** * <p>Defensive programming technique to change a {@code null} * reference to an empty one. * @@ -8198,13 +8210,9 @@ public static int indexOf(final int[] array, final int valueToFind, int startInd final int newSize = endIndexExclusive - startIndexInclusive; final Class<T> type = getComponentType(array); if (newSize <= 0) { - @SuppressWarnings("unchecked") // OK, because array is of type T - final T[] emptyArray = (T[]) Array.newInstance(type, 0); - return emptyArray; + return newInstance(type, 0); } - @SuppressWarnings("unchecked") // OK, because array is of type T - final - T[] subarray = (T[]) Array.newInstance(type, newSize); + final T[] subarray = newInstance(type, newSize); System.arraycopy(array, startIndexInclusive, subarray, 0, newSize); return subarray; } diff --git a/src/main/java/org/apache/commons/lang3/Streams.java b/src/main/java/org/apache/commons/lang3/Streams.java index 8e27558..1b8e125 100644 --- a/src/main/java/org/apache/commons/lang3/Streams.java +++ b/src/main/java/org/apache/commons/lang3/Streams.java @@ -480,9 +480,7 @@ public class Streams { @Override public Function<List<O>, O[]> finisher() { return list -> { - @SuppressWarnings("unchecked") - final O[] array = (O[]) Array.newInstance(elementType, list.size()); - return list.toArray(array); + return list.toArray(ArrayUtils.newInstance(elementType, list.size())); }; } diff --git a/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java b/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java index 8d51a21..1fd2281 100644 --- a/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java +++ b/src/main/java/org/apache/commons/lang3/event/EventListenerSupport.java @@ -282,9 +282,8 @@ public class EventListenerSupport<L> implements Serializable { * @param classLoader the class loader to be used */ private void initializeTransientFields(final Class<L> listenerInterface, final ClassLoader classLoader) { - @SuppressWarnings("unchecked") // Will throw CCE here if not correct - final L[] array = (L[]) Array.newInstance(listenerInterface, 0); - this.prototypeArray = array; + // Will throw CCE here if not correct + this.prototypeArray = ArrayUtils.newInstance(listenerInterface, 0); createProxy(listenerInterface, classLoader); } diff --git a/src/main/java/org/apache/commons/lang3/stream/Streams.java b/src/main/java/org/apache/commons/lang3/stream/Streams.java index cc5a6b6..cfad60c 100644 --- a/src/main/java/org/apache/commons/lang3/stream/Streams.java +++ b/src/main/java/org/apache/commons/lang3/stream/Streams.java @@ -16,7 +16,6 @@ */ package org.apache.commons.lang3.stream; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -32,6 +31,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.function.Failable; import org.apache.commons.lang3.function.FailableConsumer; import org.apache.commons.lang3.function.FailableFunction; @@ -105,9 +105,7 @@ public class Streams { @Override public Function<List<O>, O[]> finisher() { return list -> { - @SuppressWarnings("unchecked") - final O[] array = (O[]) Array.newInstance(elementType, list.size()); - return list.toArray(array); + return list.toArray(ArrayUtils.newInstance(elementType, list.size())); }; }