Java - 具有指向其子类的类名的静态字段的接口?

时间:2012-03-06 03:31:21

标签: java generics reflection interface

我想要一个接口,它的子类可以继承一个静态字段,该字段指向子类的名称。

我该怎么做?

例如在我看来(代码无法使用):

public interface ILogger<A> {

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

public class Sub implements ILogger<Sub> {

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

1 个答案:

答案 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, ...);
    }
}

希望这有帮助!