Является ли подпись метода на Java включенным типом возврата?

Включает ли сигнатура метода в классе/интерфейсе Java его тип возвращаемого значения?

Пример:

Знает ли Java разницу между этими двумя методами:

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

Или, может быть, имеет значение только имя метода и список параметров?

Ответы

Ответ 1

Цитата из Документы Oracle:

Определение. Два из компонентов объявления метода содержат подпись метода - имя метода и типы параметров.

enter image description here

Поскольку вопрос был изменен, чтобы включить этот пример:

public class Foo {
    public int  myMethod(int param) {}
    public char myMethod(int param) {}
}

Нет, компилятор не узнает разницу, так как их подпись: myMethod(int param) - то же самое. Вторая строка:

    public char myMethod(int param) {}

даст вам ошибку: метод уже определен в классе, что еще раз подтверждает приведенный выше оператор.

Ответ 2

Подпись метода класса в Java включает тип возвращаемого значения?

В Java это не так, но в этой JVM это может привести к очевидной путанице.

Подпись метода интерфейса в Java включает тип возврата?

Так же, как для методов класса.

Или только имя метода и список параметров?

Имя метода и типы параметров для Java. Например, аннотации и имена параметров не имеют значения.

Ответ 3

На уровне байт-кода "тип возврата" является частью сигнатуры метода. Учти это

public class Test1  {
    public Test1 clone() throws CloneNotSupportedException {
        return (Test1) super.clone();
    }
}

в байт-коде есть 2 метода clone()

public clone()LTest1; throws java/lang/CloneNotSupportedException 

public clone()Ljava/lang/Object; throws java/lang/CloneNotSupportedException 

они отличаются только типом возврата.

Ответ 4

Спецификация языка Java говорит

Два метода имеют одинаковую подпись, если они имеют одинаковые имена и типы аргументов.

таким образом, нет, возвращаемый тип не является частью сигнатуры метода.

Ответ 6

Bro, В java мы используем для вызова методов по их имени и их параметрам только для использования их в нашем коде, например

myMethod (20, 40)

поэтому JAVA ищет только аналогичное соответствие в соответствующем объявлении (name + param), поэтому сигнатура метода включает только имя метода и параметры.:)

Ответ 7

В JAVA и многих других языках вы можете вызвать метод без переменной, чтобы сохранить возвращаемое значение. Если тип возврата является частью сигнатуры метода, нет способа узнать, какой метод будет вызываться при вызове без указания возвращаемого значения сохранения переменной.

Ответ 8

Подпись метода - это только имя и список параметров.

Ответ 9

нет, в Java подпись метода не включает тип возвращаемого значения, но это объявление делает.

public             String         getString(String myString)

^access modifier   ^return type   ^name    ^parameter type and name

отредактирован на основе обратной связи ниже:)

Ответ 11

Используя AspectJ (org.aspectj.lang.reflect.MethodSignature), он имеет тип возврата

Ответ 12

ПОДПИСЬ МЕТОДА ВКЛЮЧАЕТ ТИП ВОЗВРАТА.

Компилятор игнорирует его, когда должен проверять наличие дубликатов. Для Java запрещено использование двух методов с сигнатурой, отличающейся только типом возврата.

Попробуйте следующее:

public class Called {
    public String aMethod() {
        return "";
    }
}

public class Caller {
    public static void main(String[] main) {
        aMethod();
    }
    public static void aMethod() {
        Called x = new Called();
        x.aMethod();
    }
}

Создайте проект, перейдите в каталог bin, скопируйте Caller.cass где-нибудь. Затем измените вызываемый метод:

public int aMethod() {
    return 0;
}

Создайте проект, вы увидите, что и Called.class, и Caller.class имеют новую временную метку. Замените Caller.class выше и запустите проект. У вас будет исключение:

java.lang.NoSuchMethodError: it.prova.Called.aMethod()Ljava/lang/String;

Ответ 14

Если вы попытаетесь запустить код, который вы упомянули в eclipse, у вас будет ответ относительно того, какие элементы ищет компилятор java для различия между методами java:

class Foo {
    public int  myMethod(int param) {
        return param;}
    public char *myMethod*(int param) { //this line throws an error 
        return param;
    }
}

Выдается сообщение об ошибке: Дублируйте метод myMethod (int) типа Foo.