PsiType (PsiExpression expr) { PsiElementFactory factory = JavaPsiFacade.getElementFactory(expr.getProject()); PsiType typeByExpression = getTypeByExpression(expr, factory); PsiType type = typeByExpression; final boolean isFunctionalType = LambdaUtil.notInferredType(type); PsiType exprType = expr.getType(); final boolean detectConjunct = exprType instanceof PsiIntersectionType || exprType instanceof PsiWildcardType && ((PsiWildcardType)exprType).getBound() instanceof PsiIntersectionType || exprType instanceof PsiCapturedWildcardType && ((PsiCapturedWildcardType)exprType).getUpperBound() instanceof PsiIntersectionType; if (type != null && !isFunctionalType && !detectConjunct) { return type; } ExpectedTypeInfo[] expectedTypes = ExpectedTypesProvider.getExpectedTypes(expr, false); if (expectedTypes.length == 1 || (isFunctionalType || detectConjunct) && expectedTypes.length > 0 ) { if (typeByExpression != null && Arrays.stream(expectedTypes).anyMatch(typeInfo -> typeByExpression.isAssignableFrom(typeInfo.getType()))) { return type; } type = expectedTypes[0].getType(); if (!type.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) return type; } return detectConjunct ? type : null; }