Java - интерфейс со статическим полем, указывающим на имя класса своего подкласса? - PullRequest
1 голос
/ 06 марта 2012

Мне нужен интерфейс, его подкласс может наследовать статическое поле, это поле указывает на имя подкласса.

Как я могу это сделать?

Например, на мой взгляд (код не может использоваться):

public interface ILogger<A> {

    public static String LogTag = A.class.getName();
}

public class Sub implements ILogger<Sub> {

    public Sub() {
        Log.debug(LogTag, ...);
    }
}

1 Ответ

3 голосов
/ 06 марта 2012

В Java, в отличие от C ++, это невозможно из-за способа реализации обобщений.В Java существует только один класс для каждого универсального типа, а не несколько копий для каждого использования аргумента другого типа (это называется стирание ).В результате вы не можете иметь единственную переменную, которая указывает на объект класса его подтипа, потому что может быть много подтипов, но всегда есть только одна копия статического поля.Это отличается от C ++, где каждый раз, когда создается экземпляр шаблона ILogger, вы получаете собственную копию этого статического поля.

Одним из возможных приближений было бы иметь Map в качестве статического поля, связывающего классобъекты со строками, как в

public static final Map<Class, String> classMap = new HashMap<Class, String>();

Затем вам нужно будет явно добавить каждый подтип к этой карте, возможно со статическим инициализатором:

public class Sub implements ILogger<Sub> {

    static {
        ILogger.classMap.put(Sub.class, /* ... value ... */);
    }

    public Sub() {
        Log.debug(LogTag, ...);
    }
}

Надеюсь, это поможет!

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