2012-03-06 8 views
1

サブクラスが静的フィールドを継承できるインターフェイスが必要です。そのフィールドはサブクラスの名前をポイントします。Java - そのサブクラスのクラス名を指す静的フィールドを持つインターフェイスですか?

どうすればいいですか?私の心の中で例えば

(コードが使用できない):Javaでは

public interface ILogger<A> { 

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

public class Sub implements ILogger<Sub> { 

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

答えて

3

は、C++とは異なり、これは、ジェネリックが実装されている方法には不可能です。 Javaでは、ジェネリック型ごとに1つのクラスしかありません。異なるタイプの引数が使用されるたびに複数のコピーはありません(これはerasureと呼ばれます)。結果として、サブタイプのクラスオブジェクトを指す単一の変数を持つことはできません。なぜなら、複数のサブタイプが存在する可能性がありますが、常に静的フィールドのコピーが1つだけあるからです。これはC++とは対照的です。​​テンプレートがインスタンス化されるたびに、その静的フィールドの独自のコピーが作成されます。

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

にあなたはその後、各サブタイプは、明示的に多分に、このマップに自分自身を追加していなければならないだろうと

一つの可能​​な近似は、文字列でクラスオブジェクトを関連付けるの静的フィールドとしてMapを持っているだろう静的イニシャライザ:

public class Sub implements ILogger<Sub> { 

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

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

希望します。

+0

「消去」のコンセプトをありがとうございます、私は今のところそれを知っています。しかし、私はもっと簡潔な解決策を望んでいます。あなたのコードの代わりに、 'public static final String LogTag = Sub.class.getName()'とタイプすることができます。しかし、もう一度感謝します:-) –

+1

残念ながら、Javaではより簡潔な解決策はありません。 –

+0

Downvoter-この回答が間違っているか、改善する方法を教えてください。 – templatetypedef

関連する問題