.class文件中的常量池中有一个“NameAndType”结构。
它用于动态绑定。
该类可以“导出”的所有方法都描述为“签名+返回类型”。
喜欢

“getVector()Ljava / util / Vector;”

当某些.jar中的方法的返回类型更改时,即使新类型更窄,这也会破坏我的代码。

即:
我有以下代码:

列表l = some.getList();

外部.jar包含:

公共列表getList()

比外部jar将方法签名更改为

公共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)。这意味着工作代码将仅重新编译即可更改行为。

10-07 19:34
查看更多