void (final PsiType lowerBound, final PsiType upperBound, final Set<PsiType> holder) { if (lowerBound instanceof PsiClassType && upperBound instanceof PsiClassType) { final PsiClassType.ClassResolveResult resultLower = ((PsiClassType)lowerBound).resolveGenerics(); final PsiClassType.ClassResolveResult resultUpper = ((PsiClassType)upperBound).resolveGenerics(); final PsiClass lowerClass = resultLower.getElement(); final PsiClass upperClass = resultUpper.getElement(); if (lowerClass != null && upperClass != null && !lowerClass.equals(upperClass)) { final PsiSubstitutor upperSubst = resultUpper.getSubstitutor(); final PsiClass[] parents = upperClass.getSupers(); final PsiElementFactory factory = JavaPsiFacade.getElementFactory(myProject); for (final PsiClass parent : parents) { final PsiSubstitutor superSubstitutor = TypeConversionUtil.getClassSubstitutor(parent, upperClass, upperSubst); if (superSubstitutor != null) { final PsiClassType type = factory.createType(parent, superSubstitutor); holder.add(type); fillTypeRange(lowerBound, type, holder); } } } } else if (lowerBound instanceof PsiArrayType && upperBound instanceof PsiArrayType) { fillTypeRange(((PsiArrayType)lowerBound).getComponentType(), ((PsiArrayType)upperBound).getComponentType(), holder); } }