繁体   English   中英

Java泛型:为每个内部类构建参数化类

[英]Java Generics: Build Parameterized Classes for every inner class

说我有一个界面:

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

我有一个名为AuthenticationMethods的类,它具有几个内部类。

我想要做的是编写一个实用程序,在其中可以获取所有内部类,并生成一个使用内部类的Type T实现Authentication<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进入身份验证接口的参数化实现中的类型?

你可以做这样的事情。

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

如果我对您的理解正确,则希望对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
        }
    };
}

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

Authentication<TokenType> authForTokenType = createAuthenticationImplClass(TokenType.class);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM