Java中的object.getClass()方法是如何返回一个带类型的Class实例的?

16
在Java中,Object.getClass的类型签名为public final Class<?> getClass(),但JavaDoc注释提到它实际上将是"Class<? extends |X|>,其中|X|是调用getClass的表达式的静态类型的擦除"。
这确实是编译器执行的方式,并得到IDE等工具的支持,但是这种魔法是如何运作的呢?编译器是否以特殊的方式处理此方法?它是否实际上为每种类型生成getClass()的覆盖?
我理解这只是一个编译时构造,在运行时,Class的泛型类型参数是/将是什么并不会有任何区别。

简而言之:据我所知,具有通用返回类型的方法从调用它的上下文中获取其实际参数。例如,结果分配给的变量的类型。这种行为适用于所有方法,“getClass()”在此方面并不特殊。但我认为,应该由更具有确立知识的人来回答这个问题;-) - André Stannek
1个回答

10

是的,编译器会特别处理该方法。例如,请参见Eclipse编译器中Scope类中对createGetClassMethod()方法的调用。(同一类中还有其他几个对该方法的调用。)


3
请注意,这种方法在JLS中有明确的提及,同时还有类型要求:JLS 4.3.2 - yshavit
是的,OP指出javadoc确实提到了这一点,但正如你所指出的那样,JLS是权威。有趣的是,需要注意的是,javadoc主要记录高级或JVM级别的语义,但偶尔会添加Java语义以增加清晰度。 - Brett Kail
1
是的,同意。我认为值得注意的唯一原因是,有人可以合理地问,“为什么编译器必须特别处理这个方法,只因为javadoc说它不同?什么使java.lang.Class#getMethodcom.myname.Foo#Bar更特殊?我不能特别处理返回值!”答案是它很特别,因为JLS明确指定了它。也许这是一个迂腐的观点,但对我来说很重要。 :) - yshavit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接