0

私はインターフェースを持っているとしましょう:

public interface Authentication<T> {
   public void authenticate(T token);
}

AuthenticationMethodsいくつかの内部クラスを持つクラスがあります。

私がやりたいことは、すべての内部クラスを取得できるユーティリティを作成し、次のように、内部クラスAuthentication<T>の Type とのインターフェイスを実装するクラスを生成することです。T

for (Class clazz : AuthenticationMethods.class.getDeclaredClasses()){
   createAuthenticationImplClass(clazz);
}

private <T> Authentication<T> createAuthenticationImplClass(Class clazz){
  return new Authentication<clazz>() {
     @Override
     public void authenticate(clazz token) throws Exception {
        //do something with the token
     }
   };
}

明らかclazzに代わりに使用するだけではT機能しません。

clazz から Authentication インターフェースのパラメーター化された実装にタイプを取得するにはどうすればよいですか?

4

2 に答える 2

3

このようなことができます。

private <T extends Class<?>> Authentication<T> createAuthenticationImplClass(T clazz){
  return new Authentication<T>() {
     @Override
     public void authenticate(T token) throws Exception {
        //do something with the token
     }
   };
}

Authentication<Class<String>> = createAuthenticationImplClass(String.class);

またはこれ

private <T> Authentication<T> createAuthenticationImplClass(Class<T> clazz){
  return new Authentication<T>() {
     @Override
     public void authenticate(T token) throws Exception {
        //do something with the token
     }
   };
}

例:

Authentication<String> = createAuthenticationImplClass(String.class);

違いは、最初の例では、authenticateメソッドのパラメーターに Class 型があることです。2番目のパラメーターは、クラスが表す型になります。

于 2012-12-19T22:12:07.360 に答える
1

私があなたを正しく理解していれば、あなたはclazzクラスのトークンを認証したいと考えています。次に、ファクトリ メソッド パラメーターをジェネリック クラス型でパラメーター化する必要があります。

private <T> Authentication<T> createAuthenticationImplClass(Class<T> clazz){
    return new Authentication<T>() {
        @Override
        public void authenticate(T token) throws Exception {
            //do something with the token
        }
    };
}

もちろん、現時点では、宣言されたクラスに対して forループを実行すると、ジェネリック型が失われるため、タイプ セーフなClassインスタンスを渡す唯一の方法は、明示的なクラス名です。

Authentication<TokenType> authForTokenType = createAuthenticationImplClass(TokenType.class);
于 2012-12-19T22:11:32.837 に答える