Доступ к статическому полю из переменной Class <A> - PullRequest
0 голосов
/ 05 ноября 2011

У меня следующая ситуация (я знаю, что это не звучит реально, но я упростил ее для лучшего понимания):

  • A class A, с объявленным public static int f;
  • Другие классы B, C, D, ... , которые расширяют A
  • Метод foo (где-то еще, не имеет значения) со следующей подписью: int foo(Class< A> classz);

Теперь я хочу, чтобы реализация этого метода возвращала значение, если статическое поле f, из класса, представленного classz; подклассы A могут иметь разные значения. Я не хочу использовать отражение (и ни новые функции jdk7. *). Пока у меня есть это решение, которое работает, но не хорошо, так как оно создает объект (который не должен быть необходим) и генерирует предупреждение путем доступа к статическому полю из экземпляра:

int foo(Class< A> classz) throws [don't matter] {
    return classz.newInstance().f;
}

Есть предложения? Заранее спасибо?

PS: не знаю, как набрать Class< ?> без пробела ...

1 Ответ

2 голосов
/ 05 ноября 2011

Не совсем понятно, что вы пытаетесь сделать или почему вы вообще проходите курс обучения - похоже, вам просто нужно:

int foo() {
    return A.f;
}

В случае успеха, это то, что ваш нынешнийкод будет возвращаться в любом случае.Ваш код эквивалентен:

int foo(Class<A> classz) throws ... {
    A ignored = classz.newInstance();
    return A.f;
}

Похоже, вы пытаетесь использовать полиморфизм со статическими полями - это просто не сработает.Статические члены не являются полиморфными и не являются полями.Если вы объявляете дополнительные f поля в каждом подклассе, вам придется использовать отражение, чтобы получить их, но я советую вам в любом случае изменить дизайн.Если вы не объявляете дополнительные f поля в каждом подклассе, то в любом случае у вас есть только одно поле - B.f и C.f в любом случае разрешат A.f ...1018 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...