Доступ к статическому методу в общем классе - PullRequest
1 голос
/ 05 мая 2011

Я хотел бы получить доступ к статическому методу в классе, но этот класс был передан в общем виде.

Я сделал следующее:

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 ]

9 голосов
/ 05 мая 2011

Вы не можете сделать это без отражения, потому что тип T стирается во время выполнения (это означает, что он будет уменьшен до его нижней границы, которая составляет Base).

Поскольку у вас есть доступ к Class<T>, вы можете сделать это с отражением, однако:

return (String) clazz.getMethod("getStaticName").invoke(null);

Обратите внимание, что я считаю такой код запахом кода, и он довольно хрупкий. Не могли бы вы сказать нам, зачем вам это нужно?

0 голосов
/ 05 мая 2011

Я не верю, что вы можете сделать это без отражения.

Похоже, вы должны делать это не используя статические методы. Вы используете наследование, но статические методы не следуют правилам наследования.

0 голосов
/ 05 мая 2011

Если для вас нормально передавать экземпляр объекта, а не 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
...