boolean (PsiType @NotNull [] types, PsiElement position) { final PsiNewExpression newExpression = PsiTreeUtil.getParentOfType(position, PsiNewExpression.class, false); if (!PsiUtil.isLanguageLevel8OrHigher(position)) { return newExpression != null && PsiTypesUtil.getExpectedTypeByParent(newExpression) != null; } final PsiCallExpression methodCallExpression = PsiTreeUtil.getParentOfType(newExpression, PsiCallExpression.class, false, PsiStatement.class); if (methodCallExpression != null && PsiUtil.isLanguageLevel8OrHigher(methodCallExpression)) { PsiElement parent = PsiUtil.skipParenthesizedExprUp(newExpression.getParent()); PsiExpressionList argumentList = methodCallExpression.getArgumentList(); final int idx = argumentList != null ? ArrayUtil.find(argumentList.getExpressions(), parent) : -1; if (idx > -1) { final JavaResolveResult resolveResult = methodCallExpression.resolveMethodGenerics(); final PsiMethod method = (PsiMethod)resolveResult.getElement(); if (method != null) { final PsiParameter[] parameters = method.getParameterList().getParameters(); if (idx < parameters.length) { final PsiType expectedType = resolveResult.getSubstitutor().substitute(parameters[idx].getType()); final PsiClass aClass = PsiUtil.resolveClassInType(expectedType); if (aClass != null) { final PsiClassType inferredArg = JavaPsiFacade.getElementFactory(method.getProject()).createType(aClass, types); return TypeConversionUtil.isAssignable(expectedType, inferredArg); } } } } } return true; }