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 类型。在第二个中,参数将是该类表示的类型。

于 2012-12-19T22:12:07.360 回答
1

如果我理解正确,您想要验证clazz该类的令牌。然后您需要使用泛型 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
        }
    };
}

当然,此时您为声明的类执行for循环会丢失泛型类型,因此传递类型安全Class实例的唯一方法是显式类名:

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