WICKET-3680 Make Objects.convertValue() generic
git-svn-id: https://svn.apache.org/repos/asf/wicket/trunk@1100561 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java b/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
index 7d8c7a8..ebbe7df 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
@@ -99,10 +99,10 @@
 
 			try
 			{
-				Object converted = Objects.convertValue(value, theType);
-				if (theType.isAssignableFrom(converted.getClass()))
+				C converted = Objects.convertValue(value, theType);
+				if (converted != null)
 				{
-					return theType.cast(converted);
+					return converted;
 				}
 				else
 				{
@@ -129,9 +129,9 @@
 
 			try
 			{
-				return (String)Objects.convertValue(value, String.class);
+				return Objects.convertValue(value, String.class);
 			}
-			catch (Exception e)
+			catch (RuntimeException e)
 			{
 				throw new ConversionException("Could not convert object of type: " +
 					value.getClass() + " to string. Possible its #toString() returned null. " +
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/lang/PropertyResolverConverter.java b/wicket-core/src/main/java/org/apache/wicket/util/lang/PropertyResolverConverter.java
index 31d4f99..9ff8627 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/lang/PropertyResolverConverter.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/lang/PropertyResolverConverter.java
@@ -49,13 +49,12 @@
 	/**
 	 * @param <T>
 	 *            target type
-	 * @param <I>
-	 *            input object's type
 	 * @param object
 	 * @param clz
-	 * @return The converted object
+	 * @return converted value of the type given, or null if the value cannot be converted to the
+	 *         given type.
 	 */
-	public <T, I> Object convert(I object, Class<T> clz)
+	public <T> T convert(Object object, Class<T> clz)
 	{
 		if (object == null)
 		{
@@ -63,7 +62,9 @@
 		}
 		if (clz.isAssignableFrom(object.getClass()))
 		{
-			return object;
+			@SuppressWarnings("unchecked")
+			T result = (T)object;
+			return result;
 		}
 		IConverter<T> converter = converterSupplier.getConverter(clz);
 		if (object instanceof String)
@@ -72,21 +73,27 @@
 		}
 		else if (clz == String.class)
 		{
-			return convertToString(object, locale);
+			@SuppressWarnings("unchecked")
+			T result = (T)convertToString(object, locale);
+			return result;
 		}
 		else
 		{
+			T result;
 			try
 			{
-				return Objects.convertValue(object, clz);
+				result = Objects.convertValue(object, clz);
 			}
 			catch (RuntimeException ex)
 			{
-				// ignore that try it the other way
+				result = null;
 			}
-			// go through string to convert to the right object.
-			String tmp = convertToString(object, locale);
-			return converter.convertToObject(tmp, locale);
+			if (result == null)
+			{
+				String tmp = convertToString(object, locale);
+				result = converter.convertToObject(tmp, locale);
+			}
+			return result;
 		}
 	}
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java b/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java
index d423c95..8a42ce6 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java
@@ -615,7 +615,7 @@
 				private static final long serialVersionUID = 1L;
 
 				@Override
-				public <T, I> Object convert(I object, java.lang.Class<T> clz)
+				public <T> T convert(Object object, java.lang.Class<T> clz)
 				{
 					return null;
 				}
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/lang/Objects.java b/wicket-util/src/main/java/org/apache/wicket/util/lang/Objects.java
index 56f38e0..fd0488e 100755
--- a/wicket-util/src/main/java/org/apache/wicket/util/lang/Objects.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/lang/Objects.java
@@ -283,14 +283,16 @@
 	 * This method also detects when arrays are being converted and converts the components of one
 	 * array to the type of the other.
 	 * 
+	 * @param <T>
+	 *            target type
 	 * @param value
 	 *            an object to be converted to the given type
 	 * @param toType
 	 *            class type to be converted to
-	 * @return converted value of the type given, or value if the value cannot be converted to the
+	 * @return converted value of the type given, or null if the value cannot be converted to the
 	 *         given type.
 	 */
-	public static Object convertValue(final Object value, final Class<?> toType)
+	public static <T> T convertValue(final Object value, final Class<T> toType)
 	{
 		Object result = null;
 
@@ -362,7 +364,9 @@
 				result = primitiveDefaults.get(toType);
 			}
 		}
-		return (result != null) ? result : value;
+		@SuppressWarnings("unchecked")
+		T finalResult = (T)result;
+		return finalResult;
 	}
 
 	/**