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;
}

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 ; }
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 .
