2012-02-14 91 views
0

參數化類的靜態方法,我有延伸相同的超類的列表,其中有一個靜態字段名爲foo:呼籲在Java中

List<Class<? extends SuperClass>> list; 

我怎麼可以在列表的元素上訪問富?

回答

4

爲什麼要

Superclass.foo 

不行?由於它是靜態的,您的List是完全不相關的。還有子類,因爲該字段只在Superclass中存在一次。

+0

好吧,我剛剛意識到我搞砸了我的帖子。如果foo是一種方法呢?關鍵是子類可能會覆蓋foo,因爲每個子類都應該返回一個不同的值。 – 2012-02-14 22:35:29

+0

字段或方法 - 它在這裏是一樣的(當然除了'()')。由於「it」(字段或方法)是靜態的,所以不能被覆蓋。覆蓋僅適用於非靜態字段。如果您調用'Superclass.foo',即使存在'Childclass.foo',您也將獲得'Superclass.foo'。如果你想'Childclass.foo',你必須這樣說。並且:如果沒有'Childclass.foo',但是你這麼說,編譯器會默默地使'Superclass.foo'編譯時間。但是在運行時會發生重載。所以不要把編譯器的仁慈與重寫混爲一談。 – 2012-02-14 22:45:36

+0

所以,如果我不能重寫靜態成員,這是否意味着我沒有辦法在運行時檢索每個類特定的值? – 2012-02-14 23:17:55

3

您可以通過類名在超類訪問靜態字段富:

SuperClass.foo 

靜態字段的所有實例和所有子類的一個值。

-1

你可以讓foo保護,這樣你就可以在子類中訪問它。

1

類的名字和他的靜態成員:

SuperClass.foo 
0

我覺得這裏的問題是,你要調用一個類的靜態方法,而不是一類的超類的孩子。

假設你有一個Class Foo,它有一個返回String的靜態方法欄。你可以這樣做:

String test = Foo.bar(); 

,但你不能做到這一點:

String test = Foo.class.bar(); 

你在你的例子是什麼會更喜歡這樣的:

Class<? extends SuperClass> classz = Foo.class; 
String test = classz.bar(); // same as Foo.class.bar(); 

解決方案:您應該能夠在此處使用反射來調用該方法:

String test = (String) Foo.class.getMethod("bar").invoke(null);