diff --git a/gson/src/main/java/com/google/gson/internal/$Gson$Types.java b/gson/src/main/java/com/google/gson/internal/$Gson$Types.java index 8a65031d1a..ab024b4bfa 100644 --- a/gson/src/main/java/com/google/gson/internal/$Gson$Types.java +++ b/gson/src/main/java/com/google/gson/internal/$Gson$Types.java @@ -57,7 +57,7 @@ public final class $Gson$Types { * @return a {@link java.io.Serializable serializable} parameterized type. */ public static ParameterizedType newParameterizedTypeWithOwner( - Type ownerType, Type rawType, Type... typeArguments) { + Type ownerType, Class rawType, Type... typeArguments) { return new ParameterizedTypeImpl(ownerType, rawType, typeArguments); } @@ -112,7 +112,7 @@ public static Type canonicalize(Type type) { } else if (type instanceof ParameterizedType) { ParameterizedType p = (ParameterizedType) type; return new ParameterizedTypeImpl( - p.getOwnerType(), p.getRawType(), p.getActualTypeArguments()); + p.getOwnerType(), (Class) p.getRawType(), p.getActualTypeArguments()); } else if (type instanceof GenericArrayType) { GenericArrayType g = (GenericArrayType) type; @@ -411,7 +411,8 @@ private static Type resolve( toResolve = ownerChanged || argsChanged - ? newParameterizedTypeWithOwner(newOwnerType, original.getRawType(), args) + ? newParameterizedTypeWithOwner( + newOwnerType, (Class) original.getRawType(), args) : original; break; @@ -519,10 +520,9 @@ private static final class ParameterizedTypeImpl implements ParameterizedType, S @SuppressWarnings("serial") private final Type[] typeArguments; - public ParameterizedTypeImpl(Type ownerType, Type rawType, Type... typeArguments) { - // TODO: Should this enforce that rawType is a Class? See JDK implementation of - // the ParameterizedType interface and https://bugs.openjdk.org/browse/JDK-8250659 + public ParameterizedTypeImpl(Type ownerType, Class rawType, Type... typeArguments) { requireNonNull(rawType); + if (ownerType == null && requiresOwnerType(rawType)) { throw new IllegalArgumentException("Must specify owner type for " + rawType); } diff --git a/gson/src/main/java/com/google/gson/reflect/TypeToken.java b/gson/src/main/java/com/google/gson/reflect/TypeToken.java index 49de430039..d0bd1824f2 100644 --- a/gson/src/main/java/com/google/gson/reflect/TypeToken.java +++ b/gson/src/main/java/com/google/gson/reflect/TypeToken.java @@ -379,8 +379,7 @@ public static TypeToken get(Class type) { *

If {@code rawType} is a non-generic class and no type arguments are provided, this method * simply delegates to {@link #get(Class)} and creates a {@code TypeToken(Class)}. * - * @throws IllegalArgumentException If {@code rawType} is not of type {@code Class}, or if the - * type arguments are invalid for the raw type + * @throws IllegalArgumentException If the type arguments are invalid for the raw type */ public static TypeToken getParameterized(Type rawType, Type... typeArguments) { Objects.requireNonNull(rawType); @@ -392,7 +391,9 @@ public static TypeToken getParameterized(Type rawType, Type... typeArguments) // See also https://bugs.openjdk.org/browse/JDK-8250659 throw new IllegalArgumentException("rawType must be of type Class, but was " + rawType); } + Class rawClass = (Class) rawType; + TypeVariable[] typeVariables = rawClass.getTypeParameters(); int expectedArgsCount = typeVariables.length; @@ -408,14 +409,14 @@ public static TypeToken getParameterized(Type rawType, Type... typeArguments) // For legacy reasons create a TypeToken(Class) if the type is not generic if (typeArguments.length == 0) { - return get(rawClass); + return get((Class) rawType); } // Check for this here to avoid misleading exception thrown by ParameterizedTypeImpl if ($Gson$Types.requiresOwnerType(rawType)) { throw new IllegalArgumentException( "Raw type " - + rawClass.getName() + + ((Class) rawType).getName() + " is not supported because it requires specifying an owner type"); } @@ -440,7 +441,8 @@ public static TypeToken getParameterized(Type rawType, Type... typeArguments) } } - return new TypeToken<>($Gson$Types.newParameterizedTypeWithOwner(null, rawType, typeArguments)); + return new TypeToken<>( + $Gson$Types.newParameterizedTypeWithOwner(null, rawClass, typeArguments)); } /** diff --git a/gson/src/test/java/com/google/gson/reflect/TypeTokenTest.java b/gson/src/test/java/com/google/gson/reflect/TypeTokenTest.java index ddc6b92973..44c07257ef 100644 --- a/gson/src/test/java/com/google/gson/reflect/TypeTokenTest.java +++ b/gson/src/test/java/com/google/gson/reflect/TypeTokenTest.java @@ -19,12 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; -import java.lang.reflect.GenericArrayType; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.lang.reflect.TypeVariable; -import java.lang.reflect.WildcardType; +import java.lang.reflect.*; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -187,6 +182,7 @@ public void testParameterizedFactory_Invalid() { () -> TypeToken.getParameterized(List.class, new Type[] {null})); GenericArrayType arrayType = (GenericArrayType) TypeToken.getArray(String.class).getType(); + IllegalArgumentException e = assertThrows( IllegalArgumentException.class,