2017-03-29 8 views
-1

veryImportantMethod(下の例から)にClassパラメータがあるので、問題はT.classのようにする必要があることです。ジェネリッククラスのgetClass()

public abstract class Something<T> { 

    public abstract Class<T> getGenericClass(); 

} 



public class Example extends Something<Example> { 
    @Override 
    public Class<Example> getGenericClass() { 
     return Example.class; 
    } 
} 

public static abstract class BaseDao<T extends Something<T>> extends Amazing { 

     T type; 

     public T doSomething() { 
      this.veryImportantMethod(type.getGenericClass()); 
     } 

} 

public static class Son extends BaseDao<Example> { 
} 

実は私は

を取得していますが...どのように私はこれを通過することができます...書き込まれていないフィールドのNP_UNWRITTEN_FIELD

を読みますか?

+0

あなたは何を求めていますか?あなたのBaseDaoインスタンスが次のように初期化された場合、Example.classを取得することを意味しますか? '' '' BaseDao bd = new BaseDao (); '' '? –

+0

NullPointerExceptionが発生しているはずですが、 "NP_UNWRITTEN_FIELD"を取得したとしますか?これは実際にはJavaか多分Javaが呼び出すか、何か他のものにラップされていますか? –

答えて

0

私は、これはあなたが後にしている何であるかどうかを100%確実ではないんだけど...

まず、Example.getGenericClass定義されるように全く役に立たない、あなたが同じ答えを得るだろうが、例型付き上のgetClassを呼び出します変数、あなたはtypeは常にnull以外の値を持つことが保証できる場合

Example example = new Example(); 
example.getClass() == Example.class; // always true. 

したがって、あなたは、単にそれにtype.getClass()を呼び出すことができます。

typeがnullの可能性がある場合は、別の参照を保持してクラスの記録を保持しない限り、運が悪いことがあります。私はがちょうどそこにExample.classを得ることであることを疑う。その場合は、Classオブジェクトを直接指すことが最も良いのは です。この参照は、コンストラクタによって初期化されなければならず、通常、包含するオブジェクトのライブ中に変更されるべきではないため、最終的なものにするのが理にかなっています。

public static abstract class BaseDao<T extends Something<T>> extends Amazing { 

     private final Class<T> clazz; 

     public BaseDao(final Class<T> clazz) { 
      this.clazz = clazz; 
     } 

     public void doSomething() { 
      this.veryImportantMethod(clazz); 
     } 
} 
... 
class ExampleDao extends BaseDao<Example> { 
     public ExampleDao() { 
     super(Example.class); 
     } 
} 
... 
関連する問題