在靜態環境中,你怎麼不能調用getClass()
的靜態版本(而不是使用my.package.name.MyClassName.class
)?爲什麼getClass()不能用作靜態方法?
編譯器是否足夠聰明以確定何時使用對象方法+何時使用靜態方法?
注意爲清楚起見:
我不是說一個static getClass()
應使用代替非靜態方法getClass()
的(這是一種明顯的 - 如果SpecialFoo
是Foo
一個子類,那麼Foo
的getClass()
可能會返回Foo.class
或SpecialFoo.class
或別的東西,它必須在運行時確定)。
我是說,我不知道爲什麼沒有2個版本getClass()
,一個是隻適用於靜態上下文靜態方法,並定期非靜態方法getClass()
。如果這是不可能的,那麼這是不可能的,這就是答案。如果可能但尚未完成,那麼這是一個歷史選擇,也許這是一個很好的理由。這就是我想知道的。
這將是巨大的申報
final static Logger logger = LoggerFactory.getLogger(getClass());
,而不是
final static Logger logger = LoggerFactory.getLogger(my.package.name.MyClass.class);
其中前者可以逐字從一個類被複制到下一個,而後者會要求您複製類名在每個文件中。
好問題。 Groovy允許'this'在靜態上下文中引用* current類;-) – 2011-04-20 16:17:58
可能是因爲在運行時靜態方法沒有任何類上下文。 – halfdan 2011-04-20 16:19:39
權,但是從編譯器的角度來看,當你調用一個靜態方法'FOO()',它知道'FOO()'指的是靜態方法。我想我問的是爲什麼沒有返回內建靜態'.class'字段的'getClass()'靜態方法。 – 2011-04-20 16:21:57