访问泛型类的静态方法

时间:2011-05-05 12:12:46

标签: java generics methods static

我想在类上访问一个静态方法,但是要将该类传递给泛型。

我做了以下事情:

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"

这将返回“基地”,但我想要的是“孩子”任何人没有反思的建议吗?

3 个答案:

答案 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)

我不相信没有反思就能做到这一点。

看来你应该做的不是使用静态方法。您正在使用继承,但静态方法不遵循继承规则。