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 .