[英]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.