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

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

  “getVector()Ljava / util的/矢量;” 

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

即:我有以下代码:

  List l = some.getList(); 

外部.jar包含:

  public List getList() 

比外部jar更改方法签名到

  public ArrayList getList()。 

我的代码在运行时死于NoSuchMethodException,因为它无法找到

 的GetList()Ljava / UTIL /列表; 

所以,我必须重新编译我的代码。 我没有必要改变它。 只需重新编译完全相同的代码!

这也提供了两个方法, 一个签名,但不同的返回类型的能力! 编译器不会接受它,但可以通过直接编码来实现。

我的问题是为什么 ? 他们为什么这样做?

我只有一个想法:在运行时阻止复杂的类型检查。 您需要查看层次结构并检查是否存在具有List接口的父级。 这需要时间,只有编译器才有。 JVM没有。

我对吗?

谢谢。

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

public void doSomething(List util) {} public void doSomething(ArrayList util) {} 

并考虑代码:

 doSomething(getList()); 

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