JavaResolveResult (@Nullable PsiType type, @NotNull PsiElement place) { if (type instanceof PsiClassType) { return ((PsiClassType)type).resolveGenerics(); } if (type instanceof PsiDisjunctionType) { PsiType lub = ((PsiDisjunctionType)type).getLeastUpperBound(); if (lub instanceof PsiClassType) { return ((PsiClassType)lub).resolveGenerics(); } } if (type instanceof PsiCapturedWildcardType) { PsiType upperBound = ((PsiCapturedWildcardType)type).getUpperBound(); if (upperBound instanceof PsiClassType) { PsiClass resolved = ((PsiClassType)upperBound).resolve(); PsiFile containingFile = resolved != null ? resolved.getContainingFile() : null; String packageName = containingFile instanceof PsiClassOwner ? ((PsiClassOwner)containingFile).getPackageName() : null; String classText = StringUtil.isEmptyOrSpaces(packageName) ? "" : "package " + packageName + ";\n "; classText += "class I<T extends " + upperBound.getCanonicalText() + "> {}"; PsiJavaFile file = (PsiJavaFile)PsiFileFactory.getInstance(place.getProject()).createFileFromText("inference_dummy.java", JavaLanguage.INSTANCE, classText); PsiTypeParameter freshParameter = file.getClasses()[0].getTypeParameters()[0]; return new ClassCandidateInfo(freshParameter, PsiSubstitutor.EMPTY); } } if (type instanceof PsiArrayType) { return getAccessObjectClass(((PsiArrayType)type).getComponentType(), place); } return null; }