boolean (@NotNull CompletionElement another) { Object anotherElement = another.getElement(); if (!(anotherElement instanceof PsiMethod && myElement instanceof PsiMethod)) return false; if (another.myMethodRefType instanceof PsiMethodReferenceType && myMethodRefType instanceof PsiClassType) { return true; } if (anotherElement != myElement && ((PsiMethod)myElement).hasModifierProperty(PsiModifier.ABSTRACT) && !((PsiMethod)anotherElement).hasModifierProperty(PsiModifier.ABSTRACT)) { return false; } PsiType prevType = GenericsUtil.getVariableTypeByExpressionType(another.getSubstitutor().substitute(((PsiMethod)anotherElement).getReturnType())); PsiType candidateType = GenericsUtil.getVariableTypeByExpressionType(mySubstitutor.substitute(((PsiMethod)myElement).getReturnType())); return prevType != null && candidateType != null && !prevType.equals(candidateType) && prevType.isAssignableFrom(candidateType); }