jvm – Java:为什么.class文件中的方法类型包含返回类型,而不仅仅是签名?

.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没有.

我对吗?

谢谢.

最佳答案 一个原因可能是因为在编译时确定了方法重载(与重写相反).请考虑以下方法:

public void doSomething(List util) {}

public void doSomething(ArrayList util) {}

并考虑代码:

doSomething(getList());

如果Java允许返回类型更改并且没有抛出异常,则在重新编译之前调用的方法仍然是doSomething(List) – 然后它将是doSomething(ArrayList).这意味着工作代码只会因重新编译而改变行为.

点赞