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

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

Пример:

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

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

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

14 ответов

Решение

Цитирование из Oracle Docs:

Определение. Два компонента объявления метода включают сигнатуру метода - имя метода и типы параметров.

Так как вопрос был отредактирован, чтобы включить этот пример:

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

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

    public char myMethod(int param) {}

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

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

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

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

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

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

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

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

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 

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

Нет не на Яве. Имя метода и список параметров только для подписи метода. Тип возврата не включает.

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

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

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

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

,

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

мой метод (20, 40)

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

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

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

Компилятор игнорирует его, когда должен проверять наличие дубликатов. Для 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;

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

public             String         getString(String myString)

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

отредактировано на основе отзывов ниже:)

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

Reffer: Документы Oracle "Определение методов"

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

Подпись метода - это только имя и параметры метода. Но я верю, что ваш пример выдаст ошибку, если они будут в одном классе. Вы можете просто проверить это на любом ide и увидеть, что компилятор выдаст ошибку

Если вы попытаетесь запустить код, который вы упомянули в 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 .

Другие вопросы по тегам