boolean (@NotNull PsiClassType.ClassResolveResult baseResult, @NotNull PsiClass derived, @NotNull PsiManager manager, @NotNull PsiSubstitutor derivedSubstitutor, Set<? super PsiClass> visited, @NotNull LanguageLevel languageLevel) { if (visited != null && visited.contains(derived)) return true; if (languageLevel.compareTo(LanguageLevel.JDK_1_5) < 0) return true; PsiClass base = baseResult.getElement(); PsiClass[] supers = derived.getSupers(); if (manager.areElementsEquivalent(base, derived)) { derivedSubstitutor = getSuperClassSubstitutor(derived, derived, derivedSubstitutor); return areSameArgumentTypes(derived, baseResult.getSubstitutor(), derivedSubstitutor, 1); } PsiSubstitutor baseSubstitutor = getMaybeSuperClassSubstitutor(derived, base, baseResult.getSubstitutor()); if (baseSubstitutor != null) { derivedSubstitutor = getSuperClassSubstitutor(derived, derived, derivedSubstitutor); if (!areSameArgumentTypes(derived, baseSubstitutor, derivedSubstitutor)) return false; } if (visited == null) { visited = new HashSet<>(); } visited.add(derived); for (PsiClass aSuper : supers) { PsiSubstitutor s = getSuperClassSubstitutor(aSuper, derived, derivedSubstitutor); if (!checkSuperTypesWithDifferentTypeArguments(baseResult, aSuper, manager, s, visited, languageLevel)) return false; } return true; }