public boolean isMoreSpecificThan(@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);
  }
public boolean isMoreSpecificThan(@NotNull CompletionElement another)