參數化類的靜態方法,我有延伸相同的超類的列表,其中有一個靜態字段名爲foo:呼籲在Java中
List<Class<? extends SuperClass>> list;
我怎麼可以在列表的元素上訪問富?
參數化類的靜態方法,我有延伸相同的超類的列表,其中有一個靜態字段名爲foo:呼籲在Java中
List<Class<? extends SuperClass>> list;
我怎麼可以在列表的元素上訪問富?
爲什麼要
Superclass.foo
不行?由於它是靜態的,您的List
是完全不相關的。還有子類,因爲該字段只在Superclass
中存在一次。
您可以通過類名在超類訪問靜態字段富:
SuperClass.foo
靜態字段的所有實例和所有子類的一個值。
你可以讓foo保護,這樣你就可以在子類中訪問它。
類的名字和他的靜態成員:
SuperClass.foo
我覺得這裏的問題是,你要調用一個類的靜態方法,而不是一類的超類的孩子。
假設你有一個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);
好吧,我剛剛意識到我搞砸了我的帖子。如果foo是一種方法呢?關鍵是子類可能會覆蓋foo,因爲每個子類都應該返回一個不同的值。 – 2012-02-14 22:35:29
字段或方法 - 它在這裏是一樣的(當然除了'()')。由於「it」(字段或方法)是靜態的,所以不能被覆蓋。覆蓋僅適用於非靜態字段。如果您調用'Superclass.foo',即使存在'Childclass.foo',您也將獲得'Superclass.foo'。如果你想'Childclass.foo',你必須這樣說。並且:如果沒有'Childclass.foo',但是你這麼說,編譯器會默默地使'Superclass.foo'編譯時間。但是在運行時會發生重載。所以不要把編譯器的仁慈與重寫混爲一談。 – 2012-02-14 22:45:36
所以,如果我不能重寫靜態成員,這是否意味着我沒有辦法在運行時檢索每個類特定的值? – 2012-02-14 23:17:55