boolean (@NotNull PsiType type) { return type.accept(new PsiTypeVisitor<Boolean>() { @Nullable @Override public Boolean visitClassType(@NotNull PsiClassType classType) { PsiClassType.ClassResolveResult resolveResult = classType.resolveGenerics(); final PsiClass psiClass = resolveResult.getElement(); if (psiClass == null) { return true; } PsiSubstitutor substitutor = resolveResult.getSubstitutor(); for (PsiTypeParameter param : PsiUtil.typeParametersIterable(psiClass)) { PsiType psiType = substitutor.substitute(param); if (psiType != null && psiType.accept(this)) { return true; } } return super.visitClassType(classType); } @Nullable @Override public Boolean visitArrayType(@NotNull PsiArrayType arrayType) { return arrayType.getComponentType().accept(this); } @NotNull @Override public Boolean visitWildcardType(@NotNull PsiWildcardType wildcardType) { final PsiType bound = wildcardType.getBound(); return bound != null && bound.accept(this); } @Override public Boolean visitType(@NotNull PsiType type) { return false; } }); }