PsiType (@Nullable PsiType type, @NotNull GlobalSearchScope scope) { if (type instanceof PsiArrayType) { return ((PsiArrayType)type).getComponentType(); } if (type instanceof PsiClassType) { final PsiClassType.ClassResolveResult resolveResult = ((PsiClassType)type).resolveGenerics(); PsiClass aClass = resolveResult.getElement(); if (aClass == null) return null; final PsiManager manager = aClass.getManager(); final String qName = aClass.getQualifiedName(); PsiSubstitutor substitutor = resolveResult.getSubstitutor(); JavaPsiFacade facade = JavaPsiFacade.getInstance(manager.getProject()); if (qName != null) { PsiClass myClass = facade.findClass(qName, scope); if (myClass != null && myClass != aClass) { //different JDKs PsiTypeParameter thisTypeParameter = getIterableTypeParameter(facade, myClass); if (thisTypeParameter == null) return null; PsiTypeParameter thatTypeParameter = getIterableTypeParameter(facade, aClass); if (thatTypeParameter != null) { //it can be null if we reference collection in JDK1.4 module from JDK5 source substitutor = substitutor.put(thisTypeParameter, substitutor.substitute(thatTypeParameter)); } aClass = myClass; } } PsiTypeParameter typeParameter = getIterableTypeParameter(facade, aClass); if (typeParameter == null) return null; PsiClass owner = (PsiClass)typeParameter.getOwner(); if (owner == null) return null; PsiSubstitutor superClassSubstitutor = TypeConversionUtil.getClassSubstitutor(owner, aClass, substitutor); if (superClassSubstitutor == null) return null; PsiType itemType = superClassSubstitutor.substitute(typeParameter); return itemType == null ? PsiType.getJavaLangObject(manager, aClass.getResolveScope()) : itemType; } if (type instanceof PsiIntersectionType) { for (PsiType conjunct : ((PsiIntersectionType)type).getConjuncts()) { final PsiType itemType = getCollectionItemType(conjunct, scope); if (itemType != null) { return itemType; } } } if (type instanceof PsiCapturedWildcardType) { return getCollectionItemType(((PsiCapturedWildcardType)type).getUpperBound(), scope); } return null; }