boolean (PsiType @NotNull [] parameterTypes, PsiType @NotNull [] functionalInterfaceParamTypes, PsiMethod interfaceMethod, boolean varargs, @NotNull CandidateInfo conflict, int offset) { int min = Math.min(parameterTypes.length, functionalInterfaceParamTypes.length - offset); for (int i = 0; i < min; i++) { PsiType argType = PsiUtil.captureToplevelWildcards(functionalInterfaceParamTypes[i + offset], interfaceMethod.getParameterList().getParameters()[i]); PsiType parameterType = parameterTypes[i]; if (varargs && i == parameterTypes.length - 1) { if (!TypeConversionUtil.isAssignable(parameterType, argType) && !TypeConversionUtil.isAssignable(((PsiArrayType)parameterType).getComponentType(), argType)) { markNotApplicable(conflict); return false; } } else if (!TypeConversionUtil.isAssignable(parameterType, argType)) { markNotApplicable(conflict); return false; } } return !varargs || parameterTypes.length - 1 <= functionalInterfaceParamTypes.length - offset; }