假设库中有一个方法
public static <E> void doSmth(Collection<E> foo, Collection<E> bar){...}
,它在以下代码中使用:
Set<Object> foo = ...;
List<Object> bar = ...;
doSmth(foo, bar);
现在,另一个版本的库在类路径中替代前者,它有两个方法:
public static <E> void doSmth(Collection<E> foo, Collecion<E> bar){...}
public static <E> void doSmth(Set<E> foo, List<E> bar){...}
不会重新编译并运行应用程序。将使用哪种方法?
答案 0 :(得分:2)
重载解析是一个编译时进程,因此如果不重新编译,其结果将无法更改。
所以,
public static <E> void doSmth(Collection<E> foo, Collecion<E> bar){...}
将使用,因为它的签名是在编译文件中指定的。
答案 1 :(得分:1)
如果在类路径中有相同库的2个版本,则很难分辨哪个类加载器首先加载(以及它将使用哪个版本) - 实际上机会结果会因机器和JVM而异到JVM。
如果确实需要首先加载某个版本,可以通过命令行中的-Xbootclasspath
参数将其添加到 bootclasspath 。
答案 2 :(得分:1)
库不包含方法,类可以。并且类在第一次需要时由类加载器加载。
类(通常)以与它们在类路径中出现的顺序相同的顺序加载。 通常只是因为花哨的自定义类加载器可以实现其他策略。
那么对你的问题,并查看正常的行为:如果我们在路径上有两个同名的类,一个包含两个,另一个包含方法,然后只加载一个类,这是类加载器首先找到的类。加载一个类后,不需要(相同的)类加载器再次查找具有相同名称的类。
Overloading is determined statically at compile time, so method 1 will (still) be called.