我想在类上访问一个静态方法,但是要将该类传递给泛型。
我做了以下事情:
class Base{
public static String getStaticName(){
return "Base";
}
}
class Child extends Base{
public static String getStaticName(){
return "Child";
}
}
class StaticAccessor{
public static <T extends Base>String getName(Class<T> clazz){
return T.getStaticName();
}
}
StaticAccessor.getName() // --> "Base"
这将返回“基地”,但我想要的是“孩子”任何人没有反思的建议吗?
答案 0 :(得分:9)
如果没有反射,你不能这样做,因为类型T
在运行时被删除(意味着它将被缩减到它的下限,即Base
)。
由于 可以访问Class<T>
,您可以使用反射进行访问,但是:
return (String) clazz.getMethod("getStaticName").invoke(null);
请注意,我认为此类代码具有代码味道,并且非常脆弱。你能告诉我们你为什么需要它吗?
答案 1 :(得分:0)
如果您可以在静态访问器中传递对象实例而不是Class,那么,有一个简单而优雅的解决方案:
public class Test {
static class Base {
public static String getStaticName() { return "Base"; }
public String myOverridable() { return Base.getStaticName(); };
}
static class Child extends Base {
public static String getStaticName() { return "Child"; }
@Override
public String myOverridable() { return Child.getStaticName(); };
}
static class StaticAccessor {
public static <T extends Base>String getName(T instance) {
return instance.myOverridable();
}
}
public static void main(String[] args) {
Base b = new Base();
Child c = new Child();
System.out.println(StaticAccessor.getName(b));
System.out.println(StaticAccessor.getName(c));
}
}
输出结果为:
Base
Child
答案 2 :(得分:0)
我不相信没有反思就能做到这一点。
看来你应该做的不是使用静态方法。您正在使用继承,但静态方法不遵循继承规则。