私はJavaで次の擬似コードていない:私はMyClassSubとMyGenericClassの新しいインスタンスを作成すると、私は期待してい、そのタイプとしてのJavaのジェネリックは、TとTのメソッドを呼び出し、そのスーパークラスとして
class MyClassSuper{
public static final String VALUE = "e";
}
class MyClassSub extends MyClassSuper{
public static final String VALUE = "f";
}
class MyGenericClass<T extends MyClassSuper> {
public void print(){
System.out.println(T.VALUE);
}
}
"f"を印刷する印刷方法ですが、代わりに "e"が印刷されます。 MyGenericClassに、Tが現在拡張しているスーパークラスを保持している間にTを実際の型として扱うことは可能ですか?
EDIT:
実際のコード(省略):
public class Bean implements Serializable {
public static final String FILE_EXT = "";
private static final long serialVersionUID = 1L;
}
public class UserBean extends Bean{
public static final String FILE_EXT = "u";
private static final long serialVersionUID = 1L;
private String name;
public UserBean(String name){
this.name = name;
}
}
public class BeanPersistence<T extends Bean> implements IBeanPersistence<T> {
public void printExtension(){
System.out.println(T.FILE_EXT);
}
}
私が書くしようとしているコードです。基本的には、BeanPersistenceクラスが、初期化されたBeanのタイプに基づいて、書き込むファイルに使用する拡張子を知りたいとします。私がこれを収集するコメントから、これを行う間違った方法です、適切な方法は何でしょうか? (明らかにprintExtensionメソッドはテストするためのものです)
してください、あなたは私たちに 'e'を印刷し、実際のコードを表示することができますか?これは 'T.VALUE'を書くことができないので何も印刷しません。 –
@PaulBoddington実際には、私の実質的な驚きには、あなたがすることができます。'Class'にもかかわらず、これはコンパイルされます。 –
@AndyTurner私の神よ、あなたは正しい。私はそれが 'T'がバイトコードの境界に置き換えられるからだと思います。あなたは毎日何か新しいことを学びます。 –