src/main/java/com/googlecode/objectify/repackaged/gentyref/GenericTypeReflector.java
private static Type[] getExactDirectSuperTypes(Type type) {
		if (type instanceof ParameterizedType || type instanceof Class) {
			Class<?> clazz;
			if (type instanceof ParameterizedType) {
				clazz = (Class<?>)((ParameterizedType)type).getRawType();
			} else {
				// TODO primitive types?
				clazz = (Class<?>)type;
				if (clazz.isArray())
					return getArrayExactDirectSuperTypes(clazz);
			}
			
			Type[] superInterfaces = clazz.getGenericInterfaces();
			Type superClass = clazz.getGenericSuperclass();
			
			// the only supertype of an interface without superinterfaces is Object
			if (superClass == null && superInterfaces.length == 0 && clazz.isInterface()) {
				return new Type[] {Object.class};
			}
			
			Type[] result;
			int resultIndex;
			if (superClass == null) {
				result = new Type[superInterfaces.length];
				resultIndex = 0;
			} else {
				result = new Type[superInterfaces.length + 1];
				resultIndex = 1;
				result[0] = mapTypeParameters(superClass, type);
			}
			for (Type superInterface : superInterfaces) {
				result[resultIndex++] = mapTypeParameters(superInterface, type);
			}
			
			return result;
		} else if (type instanceof TypeVariable) {
			TypeVariable<?> tv = (TypeVariable<?>) type;
			return tv.getBounds();
		} else if (type instanceof WildcardType) {
			// This should be a rare case: normally this wildcard is already captured.
			// But it does happen if the upper bound of a type variable contains a wildcard
			// TODO shouldn't upper bound of type variable have been captured too? (making this case impossible?)
			return ((WildcardType) type).getUpperBounds();
		} else if (type instanceof CaptureType) {
			return ((CaptureType)type).getUpperBounds();
		} else if (type instanceof GenericArrayType) {
			return getArrayExactDirectSuperTypes(type);
		} else if (type == null) {
			throw new NullPointerException();
		} else {
			throw new RuntimeException("not implemented type: " + type);
		}
	}
private static Type[] getExactDirectSuperTypes(Type type) {
		if (type instanceof ParameterizedType || type instanceof Class) {
			Class<?> clazz;
			if (type instanceof ParameterizedType) {
				clazz = (Class<?>)((ParameterizedType)type).getRawType();
			} else {
				// TODO primitive types?
				clazz = (Class<?>)type;
				if (clazz.isArray())
					return getArrayExactDirectSuperTypes(clazz);
			}
			
			Type[] superInterfaces = clazz.getGenericInterfaces();
			Type superClass = clazz.getGenericSuperclass();
			
			// the only supertype of an interface without superinterfaces is Object
			if (superClass == null && superInterfaces.length == 0 && clazz.isInterface()) {
				return new Type[] {Object.class};
			}
			
			Type[] result;
			int resultIndex;
			if (superClass == null) {
				result = new Type[superInterfaces.length];
				resultIndex = 0;
			} else {
				result = new Type[superInterfaces.length + 1];
				resultIndex = 1;
				result[0] = mapTypeParameters(superClass, type);
			}
			for (Type superInterface : superInterfaces) {
				result[resultIndex++] = mapTypeParameters(superInterface, type);
			}
			
			return result;
		} else if (type instanceof TypeVariable) {
			TypeVariable<?> tv = (TypeVariable<?>) type;
			return tv.getBounds();
		} else if (type instanceof WildcardType) {
			// This should be a rare case: normally this wildcard is already captured.
			// But it does happen if the upper bound of a type variable contains a wildcard
			// TODO shouldn't upper bound of type variable have been captured too? (making this case impossible?)
			return ((WildcardType) type).getUpperBounds();
		} else if (type instanceof CaptureType) {
			return ((CaptureType)type).getUpperBounds();
		} else if (type instanceof GenericArrayType) {
			return getArrayExactDirectSuperTypes(type);
		} else if (type == null) {
			throw new NullPointerException();
		} else {
			throw new RuntimeException("not implemented type: " + type);
		}
	}
private static Type [ ] getExactDirectSuperTypes ( Type type ) { if ( type instanceof ParameterizedType || type instanceof Class ) { Class < ? > clazz ; if ( type instanceof ParameterizedType ) { clazz = ( Class < ? > ) ( ( ParameterizedType ) type ) . getRawType ( ) ; } else { // TODO primitive types? clazz = ( Class < ? > ) type ; if ( clazz . isArray ( ) ) return getArrayExactDirectSuperTypes ( clazz ) ; } Type [ ] superInterfaces = clazz . getGenericInterfaces ( ) ; Type superClass = clazz . getGenericSuperclass ( ) ; // the only supertype of an interface without superinterfaces is Object if ( superClass == null && superInterfaces . length == 0 && clazz . isInterface ( ) ) { return new Type [ ] { Object . class } ; } Type [ ] result ; int resultIndex ; if ( superClass == null ) { result = new Type [ superInterfaces . length ] ; resultIndex = 0 ; } else { result = new Type [ superInterfaces . length + 1 ] ; resultIndex = 1 ; result [ 0 ] = mapTypeParameters ( superClass , type ) ; } for ( Type superInterface : superInterfaces ) { result [ resultIndex ++ ] = mapTypeParameters ( superInterface , type ) ; } return result ; } else if ( type instanceof TypeVariable ) { TypeVariable < ? > tv = ( TypeVariable < ? > ) type ; return tv . getBounds ( ) ; } else if ( type instanceof WildcardType ) { // This should be a rare case: normally this wildcard is already captured. // But it does happen if the upper bound of a type variable contains a wildcard // TODO shouldn't upper bound of type variable have been captured too? (making this case impossible?) return ( ( WildcardType ) type ) . getUpperBounds ( ) ; } else if ( type instanceof CaptureType ) { return ( ( CaptureType ) type ) . getUpperBounds ( ) ; } else if ( type instanceof GenericArrayType ) { return getArrayExactDirectSuperTypes ( type ) ; } else if ( type == null ) { throw new NullPointerException ( ) ; } else { throw new RuntimeException ( "not implemented type: " + type ) ; } }
Returns the direct supertypes of the given type. Resolves type parameters.
Returns the direct supertypes of the given type . Resolves type parameters .