question: private List < ReferenceType > selectCandidates ( TypeVariable argument ) { ParameterBound lowerBound = selectLowerBound ( argument ) ; ParameterBound upperBound = selectUpperBound ( argument ) ; List < TypeVariable > typeVariableList = new ArrayList < > ( ) ; typeVariableList . add ( argument ) ; List < ReferenceType > typeList = new ArrayList < > ( ) ; for ( Type inputType : inputTypes ) { if ( inputType . isReferenceType ( ) ) { ReferenceType inputRefType = ( ReferenceType ) inputType ; Substitution < ReferenceType > substitution = Substitution . forArgs ( typeVariableList , inputRefType ) ; if ( lowerBound . isLowerBound ( inputRefType , substitution ) && upperBound . isUpperBound ( inputRefType , substitution ) ) { typeList . add ( inputRefType ) ; } } } return typeList ; }
target:  Selects all input types that potentially satisfies the bounds on the argument. If a bound has another type parameter, then the default bound is tested.