private boolean crossVariables(InferenceVariable inferenceVariable,
                                 Collection<? extends PsiType> upperBounds,
                                 Collection<? extends PsiType> lowerBounds,
                                 InferenceBound inferenceBound) {

    final InferenceBound oppositeBound = inferenceBound == InferenceBound.LOWER 
                                                           ? InferenceBound.UPPER 
                                                           : InferenceBound.LOWER;
    boolean result = false;
    for (PsiType upperBound : upperBounds) {
      final InferenceVariable inferenceVar = mySession.getInferenceVariable(upperBound);
      if (inferenceVar != null && inferenceVariable != inferenceVar) {

        if (lowerBounds != null) {
          for (PsiType lowerBound : lowerBounds) {
            result |= inferenceVar.addBound(lowerBound, inferenceBound, this);
          }
        }

        for (PsiType varUpperBound : inferenceVar.getBounds(oppositeBound)) {
          result |= inferenceVariable.addBound(varUpperBound, oppositeBound, this);
        }
      }
    }
    return result;
  }
private boolean crossVariables(InferenceVariable inferenceVariable,
                                 Collection<? extends PsiType> upperBounds,
                                 Collection<? extends PsiType> lowerBounds,
                                 InferenceBound inferenceBound)