public static boolean isProperType ( ResolvedType type ) { if ( type instanceof InferenceVariable ) { return false ; } if ( type instanceof ResolvedReferenceType ) { ResolvedReferenceType referenceType = ( ResolvedReferenceType ) type ; return referenceType . typeParametersValues ( ) . stream ( ) . allMatch ( it -> isProperType ( it ) ) ; } if ( type instanceof ResolvedWildcard ) { ResolvedWildcard wildcard = ( ResolvedWildcard ) type ; if ( wildcard . isBounded ( ) ) { return isProperType ( wildcard . getBoundedType ( ) ) ; } else { return true ; } } if ( type . isPrimitive ( ) ) { return true ; } if ( type . isTypeVariable ( ) ) { // FIXME I am not sure... return false ; } if ( type . isArray ( ) ) { return isProperType ( type . asArrayType ( ) . getComponentType ( ) ) ; } throw new UnsupportedOperationException ( type . toString ( ) ) ; }
The term proper type excludes such types that mention inference variables .