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

时间:2009-08-06 22:10:55

标签: jvm java

.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 个答案:

答案 0 :(得分:2)

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

public void doSomething(List util) {}

public void doSomething(ArrayList util) {}

考虑代码:

doSomething(getList());

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