2012-02-14 83 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);