Java: Почему тип метода в файле .class содержит тип возвращаемого значения, а не только сигнатуру? - PullRequest
4 голосов
/ 07 августа 2009

В пуле констант в файле .class есть структура "NameAndType". Используется для динамического связывания. Все методы, которые этот класс может «экспортировать», описаны как «сигнатура + тип возврата». Нравится

"getVector()Ljava/util/Vector;"

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

т.е: У меня есть следующий код:

List l = some.getList();

Внешний .jar содержит:

public List getList()

Чем внешний jar меняет подпись метода на

public ArrayList getList().

И мой код умирает во время выполнения с NoSuchMethodException, потому что он не может найти

getList()Ljava/util/List;

Итак, мне нужно перекомпилировать мой код. Я не должен менять это. Просто перекомпилируйте абсолютно одинаковый код!

Это также дает возможность иметь два метода с одной подписью, но с разными типами возврата! Компилятор не примет это, но это можно сделать с помощью прямого кодирования.

Мои вопросы Почему ? Почему они это сделали?

У меня есть только одна идея: предотвратить сложную проверку типов во время выполнения. Вы должны взглянуть на иерархию и проверить, есть ли родительский элемент с интерфейсом List. Это требует времени, и только у компилятора. JVM нет.

Я прав?

спасибо.

1 Ответ

2 голосов
/ 07 августа 2009

Одной из причин может быть то, что перегрузка метода (в отличие от переопределения) определяется во время компиляции. Рассмотрим следующие методы:

public void doSomething(List util) {}

public void doSomething(ArrayList util) {}

И рассмотрите код:

doSomething(getList());

Если бы Java позволила изменить тип возвращаемого значения и не выдать исключение, вызываемый метод по-прежнему будет doSomething (List), пока вы не перекомпилируете, - тогда это будет doSomething (ArrayList). Что означало бы, что рабочий код изменит поведение только за счет его перекомпиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...