我想要一个接口,它的子类可以继承一个静态字段,该字段指向子类的名称。
我该怎么做?
例如在我看来(代码无法使用):
public interface ILogger<A> {
public static String LogTag = A.class.getName();
}
public class Sub implements ILogger<Sub> {
public Sub() {
Log.debug(LogTag, ...);
}
}
答案 0 :(得分:3)
在Java中,与C ++不同,由于泛型的实现方式,这是不可能的。在Java中,每种泛型类型只有一个类,而不是每次使用不同类型参数时都有多个副本(这称为 erasure )。因此,您不能拥有指向其子类的类对象的单个变量,因为可以有许多子类型,但始终只有一个静态字段的副本。这与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, ...);
}
}
希望这有帮助!