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 --> 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")));