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 2022/04/28 14:52:43 UTC

[commons-beanutils] 07/23: Use generics.

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-beanutils.git

commit aba39040f30a5c32509e561292591751702170ee
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Wed Apr 27 14:50:11 2022 -0400

    Use generics.
---
 .../org/apache/commons/beanutils2/BeanPredicate.java   |  1 +
 .../apache/commons/beanutils2/ConstructorUtils.java    | 17 ++++++++++++++++-
 .../apache/commons/beanutils2/ConvertUtilsBean.java    | 10 +++++-----
 .../org/apache/commons/beanutils2/PropertyUtils.java   |  4 +---
 .../beanutils2/converters/AbstractConverter.java       |  4 ++--
 .../commons/beanutils2/converters/ClassConverter.java  | 12 +++++++-----
 .../commons/beanutils2/converters/EnumConverter.java   | 18 ++++++++++--------
 .../beanutils2/locale/LocaleConvertUtilsBean.java      | 13 +++++++------
 .../commons/beanutils2/BeanPredicateTestCase.java      |  3 +--
 9 files changed, 50 insertions(+), 32 deletions(-)

diff --git a/src/main/java/org/apache/commons/beanutils2/BeanPredicate.java b/src/main/java/org/apache/commons/beanutils2/BeanPredicate.java
index 7b58a4d7..17dd7325 100644
--- a/src/main/java/org/apache/commons/beanutils2/BeanPredicate.java
+++ b/src/main/java/org/apache/commons/beanutils2/BeanPredicate.java
@@ -36,6 +36,7 @@ public class BeanPredicate<T> implements Predicate<T> {
 
     /** Name of the property whose value will be predicated */
     private String propertyName;
+
     /** {@code Predicate} to be applied to the property value */
     private Predicate<T> predicate;
 
diff --git a/src/main/java/org/apache/commons/beanutils2/ConstructorUtils.java b/src/main/java/org/apache/commons/beanutils2/ConstructorUtils.java
index 38b3d666..f1e04e36 100644
--- a/src/main/java/org/apache/commons/beanutils2/ConstructorUtils.java
+++ b/src/main/java/org/apache/commons/beanutils2/ConstructorUtils.java
@@ -17,6 +17,7 @@
 
 package org.apache.commons.beanutils2;
 
+import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Modifier;
@@ -422,7 +423,6 @@ public class ConstructorUtils {
         return ctor.newInstance(args);
     }
 
-
     private static Object[] toArray(final Object arg) {
         Object[] args = null;
         if (arg != null) {
@@ -431,4 +431,19 @@ public class ConstructorUtils {
         return args;
     }
 
+
+    /**
+     * Delegates to {@link Array#newInstance(Class, int)}.
+     *
+     * @param <T> Component type.
+     *
+     * @param componentType See {@link Array#newInstance(Class, int)}.
+     * @param length See {@link Array#newInstance(Class, int)}.
+     * @return See {@link Array#newInstance(Class, int)}.
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T[] newArray(Class<T> componentType, int length) {
+        return (T[]) Array.newInstance(componentType, length);
+    }
+
 }
diff --git a/src/main/java/org/apache/commons/beanutils2/ConvertUtilsBean.java b/src/main/java/org/apache/commons/beanutils2/ConvertUtilsBean.java
index 3dfd876b..6dc46312 100644
--- a/src/main/java/org/apache/commons/beanutils2/ConvertUtilsBean.java
+++ b/src/main/java/org/apache/commons/beanutils2/ConvertUtilsBean.java
@@ -504,7 +504,7 @@ public class ConvertUtilsBean {
      */
     private void registerOther(final boolean throwException) {
         // @formatter:off
-        register(Class.class,          throwException ? new ClassConverter()          : new ClassConverter(null));
+        register(Class.class,          throwException ? new ClassConverter<>()        : new ClassConverter<>(null));
         register(Enum.class,           throwException ? new EnumConverter()           : new EnumConverter(null));
         register(java.util.Date.class, throwException ? new DateConverter()           : new DateConverter(null));
         register(Calendar.class,       throwException ? new CalendarConverter()       : new CalendarConverter(null));
@@ -512,16 +512,16 @@ public class ConvertUtilsBean {
         register(Path.class,           throwException ? new PathConverter()           : new PathConverter(null));
         register(java.sql.Date.class,  throwException ? new SqlDateConverter()        : new SqlDateConverter(null));
         register(java.sql.Time.class,  throwException ? new SqlTimeConverter()        : new SqlTimeConverter(null));
-        register(Timestamp.class,      throwException ? new SqlTimestampConverter()  : new SqlTimestampConverter(null));
+        register(Timestamp.class,      throwException ? new SqlTimestampConverter()   : new SqlTimestampConverter(null));
         register(URL.class,            throwException ? new URLConverter()            : new URLConverter(null));
         register(URI.class,            throwException ? new URIConverter()            : new URIConverter(null));
         register(UUID.class,           throwException ? new UUIDConverter()           : new UUIDConverter(null));
         register(LocalDate.class,      throwException ? new LocalDateConverter()      : new LocalDateConverter(null));
-        register(LocalDateTime.class, throwException ? new LocalDateTimeConverter() : new LocalDateTimeConverter(null));
+        register(LocalDateTime.class,  throwException ? new LocalDateTimeConverter()  : new LocalDateTimeConverter(null));
         register(LocalTime.class,      throwException ? new LocalTimeConverter()      : new LocalTimeConverter(null));
-        register(OffsetDateTime.class,throwException ? new OffsetDateTimeConverter():new OffsetDateTimeConverter(null));
+        register(OffsetDateTime.class, throwException ? new OffsetDateTimeConverter() : new OffsetDateTimeConverter(null));
         register(OffsetTime.class,     throwException ? new OffsetTimeConverter()     : new OffsetTimeConverter(null));
-        register(ZonedDateTime.class, throwException ? new ZonedDateTimeConverter() : new ZonedDateTimeConverter(null));
+        register(ZonedDateTime.class,  throwException ? new ZonedDateTimeConverter()  : new ZonedDateTimeConverter(null));
         register(Duration.class,       throwException ? new DurationConverter()       : new DurationConverter(null));
         register(MonthDay.class,       throwException ? new MonthDayConverter()       : new MonthDayConverter(null));
         register(Period.class,         throwException ? new PeriodConverter()         : new PeriodConverter(null));
diff --git a/src/main/java/org/apache/commons/beanutils2/PropertyUtils.java b/src/main/java/org/apache/commons/beanutils2/PropertyUtils.java
index 0b63255e..2ecf9ced 100644
--- a/src/main/java/org/apache/commons/beanutils2/PropertyUtils.java
+++ b/src/main/java/org/apache/commons/beanutils2/PropertyUtils.java
@@ -310,9 +310,7 @@ public class PropertyUtils {
      *  property cannot be found
      * @see PropertyUtilsBean#getProperty
      */
-    public static Object getProperty(final Object bean, final String name)
-            throws IllegalAccessException, InvocationTargetException,
-            NoSuchMethodException {
+    public static Object getProperty(final Object bean, final String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
         return PropertyUtilsBean.getInstance().getProperty(bean, name);
     }
 
diff --git a/src/main/java/org/apache/commons/beanutils2/converters/AbstractConverter.java b/src/main/java/org/apache/commons/beanutils2/converters/AbstractConverter.java
index 8f10a552..5cc85bfb 100644
--- a/src/main/java/org/apache/commons/beanutils2/converters/AbstractConverter.java
+++ b/src/main/java/org/apache/commons/beanutils2/converters/AbstractConverter.java
@@ -275,13 +275,13 @@ public abstract class AbstractConverter<D> implements Converter<D> {
      * Typical implementations will provide a minimum of
      * {@code String --&gt; type} conversion.
      *
-     * @param <T> Target type of the conversion.
+     * @param <R> Target type of the conversion.
      * @param type Data type to which this value should be converted.
      * @param value The input value to be converted.
      * @return The converted value.
      * @throws Throwable if an error occurs converting to the specified type
      */
-    protected abstract <T> T convertToType(Class<T> type, Object value) throws Throwable;
+    protected abstract <R> R convertToType(Class<R> type, Object value) throws Throwable;
 
     /**
      * Gets the default value for conversions to the specified
diff --git a/src/main/java/org/apache/commons/beanutils2/converters/ClassConverter.java b/src/main/java/org/apache/commons/beanutils2/converters/ClassConverter.java
index ff7dc9ae..b727a752 100644
--- a/src/main/java/org/apache/commons/beanutils2/converters/ClassConverter.java
+++ b/src/main/java/org/apache/commons/beanutils2/converters/ClassConverter.java
@@ -27,9 +27,10 @@ package org.apache.commons.beanutils2.converters;
  * Can be configured to either return a <i>default value</i> or throw a
  * {@code ConversionException} if a conversion error occurs.
  *
+ * @param <T> the type of the class.
  * @since 1.4
  */
-public final class ClassConverter extends AbstractConverter<Class> {
+public final class ClassConverter<T> extends AbstractConverter<Class<T>> {
 
     /**
      * Constructs a <b>java.lang.Class</b> <i>Converter</i> that throws
@@ -56,9 +57,10 @@ public final class ClassConverter extends AbstractConverter<Class> {
      * @return The default type this {@code Converter} handles.
      * @since 1.8.0
      */
+    @SuppressWarnings({"unchecked", "rawtypes"})
     @Override
-    protected Class<Class> getDefaultType() {
-        return Class.class;
+    protected Class<Class<T>> getDefaultType() {
+        return (Class) Class.class;
     }
 
     /**
@@ -76,7 +78,7 @@ public final class ClassConverter extends AbstractConverter<Class> {
     /**
      * <p>Converts the input object into a java.lang.Class.</p>
      *
-     * @param <T> Target type of the conversion.
+     * @param <R> Target type of the conversion.
      * @param type Data type to which this value should be converted.
      * @param value The input value to be converted.
      * @return The converted value.
@@ -84,7 +86,7 @@ public final class ClassConverter extends AbstractConverter<Class> {
      * @since 1.8.0
      */
     @Override
-    protected <T> T convertToType(final Class<T> type, final Object value) throws Throwable {
+    protected <R> R convertToType(final Class<R> type, final Object value) throws Throwable {
         if (Class.class.equals(type)) {
             ClassLoader classLoader = Thread.currentThread()
                     .getContextClassLoader();
diff --git a/src/main/java/org/apache/commons/beanutils2/converters/EnumConverter.java b/src/main/java/org/apache/commons/beanutils2/converters/EnumConverter.java
index 48de54ba..b20114f0 100644
--- a/src/main/java/org/apache/commons/beanutils2/converters/EnumConverter.java
+++ b/src/main/java/org/apache/commons/beanutils2/converters/EnumConverter.java
@@ -24,10 +24,11 @@ package org.apache.commons.beanutils2.converters;
  * {@code ConversionException} if a conversion error occurs.
  * </p>
  *
+ * @param <E> The enum type subclass
  * @since 2.0
  * @see java.lang.Enum
  */
-public final class EnumConverter extends AbstractConverter<Enum> {
+public final class EnumConverter<E extends Enum<E>> extends AbstractConverter<Enum<E>> {
 
     /**
      * Constructs a <b>java.lang.Enum</b> <i>Converter</i> that throws
@@ -54,31 +55,32 @@ public final class EnumConverter extends AbstractConverter<Enum> {
      * @return The default type this {@code Converter} handles.
      * @since 2.0
      */
+    @SuppressWarnings({"unchecked", "rawtypes"})
     @Override
-    protected Class<Enum> getDefaultType() {
-        return Enum.class;
+    protected Class<Enum<E>> getDefaultType() {
+        return (Class) Enum.class;
     }
 
     /**
      * <p>Converts a java.lang.Enum or object into a String.</p>
      *
-     * @param <T> Target type of the conversion.
+     * @param <R> Target type of the conversion.
      * @param type Data type to which this value should be converted.
      * @param value The input value to be converted.
      * @return The converted value.
      * @throws Throwable if an error occurs converting to the specified type
      * @since 2.0
      */
-    @SuppressWarnings({ "rawtypes" })
+    @SuppressWarnings({"rawtypes"})
     @Override
-    protected <T> T  convertToType(final Class<T> type, final Object value) throws Throwable {
+    protected <R> R convertToType(final Class<R> type, final Object value) throws Throwable {
         if (Enum.class.isAssignableFrom(type)) {
             final String enumValue = String.valueOf(value);
-            final T[] constants = type.getEnumConstants();
+            final R[] constants = type.getEnumConstants();
             if (constants == null) {
                 throw conversionException(type, value);
             }
-            for (final T candidate : constants) {
+            for (final R candidate : constants) {
                 if (((Enum)candidate).name().equalsIgnoreCase(enumValue)) {
                     return candidate;
                 }
diff --git a/src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java b/src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java
index 4911da98..ac168a0d 100644
--- a/src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java
+++ b/src/main/java/org/apache/commons/beanutils2/locale/LocaleConvertUtilsBean.java
@@ -105,7 +105,7 @@ public class LocaleConvertUtilsBean {
      * <li>value = map of converters for the certain locale.</li>
      * <ul>
      */
-    private final WeakFastHashMap<Locale, Map<Class<?>, LocaleConverter>> mapConverters = new WeakFastHashMap<>();
+    private final WeakFastHashMap<Locale, Map<Class<?>, LocaleConverter<?>>> mapConverters = new WeakFastHashMap<>();
 
     /**
      *  Makes the state by default (deregisters all converters for all locales)
@@ -280,6 +280,7 @@ public class LocaleConvertUtilsBean {
      * Convert an array of specified values to an array of objects of the
      * specified class (if possible) using the conversion pattern.
      *
+     * @param <T> The array component type
      * @param values Value to be converted (may be null)
      * @param clazz Java array or element class to be converted to
      * @param pattern The conversion pattern
@@ -299,8 +300,8 @@ public class LocaleConvertUtilsBean {
      * @return The map instance contains the all {@link LocaleConverter} types
      *  for the specified locale.
      */
-    protected Map<Class<?>, LocaleConverter> create(final Locale locale) {
-        final WeakFastHashMap<Class<?>, LocaleConverter> converter = new WeakFastHashMap<>();
+    protected Map<Class<?>, LocaleConverter<?>> create(final Locale locale) {
+        final WeakFastHashMap<Class<?>, LocaleConverter<?>> converter = new WeakFastHashMap<>();
         converter.setFast(false);
 
         converter.put(BigDecimal.class, new BigDecimalLocaleConverter(locale, applyLocalized));
@@ -341,7 +342,7 @@ public class LocaleConvertUtilsBean {
      * Remove any registered {@link LocaleConverter}.
      */
     public void deregister() {
-        final Map<Class<?>, LocaleConverter> defaultConverter = lookup(defaultLocale);
+        final Map<Class<?>, LocaleConverter<?>> defaultConverter = lookup(defaultLocale);
         mapConverters.setFast(false);
 
         mapConverters.clear();
@@ -398,7 +399,7 @@ public class LocaleConvertUtilsBean {
      * @return The registered locale Converter, if any
      */
     public <T> LocaleConverter<T> lookup(final Class<T> clazz, final Locale locale) {
-        final LocaleConverter<T> converter = lookup(locale).get(clazz);
+        final LocaleConverter<T> converter = (LocaleConverter<T>) lookup(locale).get(clazz);
 
         if (log.isTraceEnabled()) {
             log.trace("LocaleConverter:" + converter);
@@ -415,7 +416,7 @@ public class LocaleConvertUtilsBean {
      * @return The map instance contains the all {@link LocaleConverter} types for
      *  the specified locale.
      */
-    protected Map<Class<?>, LocaleConverter> lookup(final Locale locale) {
+    protected Map<Class<?>, LocaleConverter<?>> lookup(final Locale locale) {
         return mapConverters.computeIfAbsent(locale == null ? defaultLocale : locale, this::create);
     }
 
diff --git a/src/test/java/org/apache/commons/beanutils2/BeanPredicateTestCase.java b/src/test/java/org/apache/commons/beanutils2/BeanPredicateTestCase.java
index f0fc201e..8c87c341 100644
--- a/src/test/java/org/apache/commons/beanutils2/BeanPredicateTestCase.java
+++ b/src/test/java/org/apache/commons/beanutils2/BeanPredicateTestCase.java
@@ -23,7 +23,6 @@ import junit.framework.TestCase;
 
 /**
  * Unit test for {@link BeanPredicate}
- *
  */
 public class BeanPredicateTestCase extends TestCase {
 
@@ -46,7 +45,7 @@ public class BeanPredicateTestCase extends TestCase {
     }
 
     public void testInstanceOf() {
-        final Predicate<String> p = s -> (s instanceof String);
+        final Predicate<String> p = s -> s instanceof String;
         final BeanPredicate<String> predicate = new BeanPredicate<>("stringProperty", p);
         assertTrue(predicate.test(new TestBean("foo")));
         assertTrue(predicate.test(new TestBean("bar")));