package org.junit.runners.model; 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.util.List; class NoGenericTypeParametersValidator { private final Method fMethod; NoGenericTypeParametersValidator(Method method) { this.fMethod = method; } void validate(List errors) { for (Type each : fMethod.getGenericParameterTypes()) validateNoTypeParameterOnType(each, errors); } private void validateNoTypeParameterOnType(Type type, List errors) { if (type instanceof TypeVariable) { errors.add(new Exception("Method " + fMethod.getName() + "() contains unresolved type variable " + type)); } else if (type instanceof ParameterizedType) validateNoTypeParameterOnParameterizedType((ParameterizedType) type, errors); else if (type instanceof WildcardType) validateNoTypeParameterOnWildcardType((WildcardType) type, errors); else if (type instanceof GenericArrayType) validateNoTypeParameterOnGenericArrayType((GenericArrayType) type, errors); } private void validateNoTypeParameterOnParameterizedType(ParameterizedType parameterized, List errors) { for (Type each : parameterized.getActualTypeArguments()) validateNoTypeParameterOnType(each, errors); } private void validateNoTypeParameterOnWildcardType(WildcardType wildcard, List errors) { for (Type each : wildcard.getUpperBounds()) validateNoTypeParameterOnType(each, errors); for (Type each : wildcard.getLowerBounds()) validateNoTypeParameterOnType(each, errors); } private void validateNoTypeParameterOnGenericArrayType( GenericArrayType arrayType, List errors) { validateNoTypeParameterOnType(arrayType.getGenericComponentType(), errors); } }