【发布时间】:2015-03-04 11:18:51
【问题描述】:
我今天遇到了 Eclipse 编译器的一个奇怪行为,我不知道该怎么想。我们正在尝试创建一个有用的Cloneable 界面,如下所示:
public interface PublicCloneable extends Cloneable {
Object clone();
static <T extends PublicCloneable> T clone(final T obj) {
if (obj != null) {
return (T) obj.clone();
}
return null;
}
}
有趣的是编译器抱怨obj.clone():Unhandled exception type CloneNotSupportedException
我知道如何解决它,我们可以将 obj 转换为 PublicCloneable 并完成它。但我感兴趣的是:为什么编译器会更喜欢Object 的方法而不是实现的方法?
【问题讨论】:
-
编译器在编译时只检查被调用的方法是否存在于层次结构的最顶层类中。它不会解析对实际具体类的调用。
-
@TheLostMind 有什么区别?最顶级的仍然是
PublicCloneable而不是Object。 -
没有。编译器检查该方法是否在
PublicCloneable的超类之一中定义。在运行时,实际调用将解析为具体类的clone()方法。简单地说,编译器并不关心 Your 具体类 是否真的是那个方法。它想知道的是你的类的类层次结构中的某个人应该拥有它。找到它的那一刻,它说 - 代码很好! -
@TheLostMind 所以编译器以与运行时执行完全相反的方向解析它?太疯狂了! o_O
-
编译器只是检查它的存在.. 就是这样:P