You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2021/05/25 14:18:55 UTC

[commons-lang] 03/03: Add and use ArrayUtils.newInstance(Class, int).

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 <ga...@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&gt;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&gt;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()));
             };
         }