Java 参数化的通用 Class :无限通配符与原始类型
Java Generic For Parameterized Class : Unbounded Wildcards vs Raw Type
我有一个参数化接口 RestHandler。
public interface RestHandler<T> {
blah blah blah...
}
我需要使用 Class.forName 从配置中创建一个 class。现在我想出了三个版本,都编译成功了。
版本 1:
@SuppressWarnings("unchecked")
public static <T> RestHandler<T> create(final String handlerImplFqcn) throws ClassNotFoundException,
IllegalAccessException,
InstantiationException {
Class<?> handlerClass = Class.forName(handlerImplFqcn);
return (RestHandler<T>) handlerClass.newInstance();
}
版本 2:
public static RestHandler<?> create(final String handlerImplFqcn) throws ClassNotFoundException,
IllegalAccessException,
InstantiationException {
@SuppressWarnings("rawtypes")
Class handlerClass = Class.forName(handlerImplFqcn);
return (RestHandler<?>) handlerClass.newInstance();
}
版本 3:
public static RestHandler<?> create(final String handlerImplFqcn) throws ClassNotFoundException,
IllegalAccessException,
InstantiationException {
Class<?> handlerClass = Class.forName(handlerImplFqcn);
return (RestHandler<?>) handlerClass.newInstance();
}
我的问题是,为什么它们都有效,哪一个是最佳实践?
使用版本 1。
版本 2 使用原始类型 - 尽可能避免使用这些类型。
版本 3 使用 <?>
这通常也是一种反模式,因为它很少能达到您想要达到的目的。
版本 1,重写为:
public static <T extends RestHandler<?>> RestHandler<T> create(final String handlerImplFqcn) throws ClassNotFoundException, IllegalAccessException, InstantiationException, ClassCastException {
Class<T> handlerClass = (Class<T>) Class.forName(handlerImplFqcn);
return (RestHandler<T>) handlerClass.newInstance();
}
我有一个参数化接口 RestHandler。
public interface RestHandler<T> {
blah blah blah...
}
我需要使用 Class.forName 从配置中创建一个 class。现在我想出了三个版本,都编译成功了。
版本 1:
@SuppressWarnings("unchecked")
public static <T> RestHandler<T> create(final String handlerImplFqcn) throws ClassNotFoundException,
IllegalAccessException,
InstantiationException {
Class<?> handlerClass = Class.forName(handlerImplFqcn);
return (RestHandler<T>) handlerClass.newInstance();
}
版本 2:
public static RestHandler<?> create(final String handlerImplFqcn) throws ClassNotFoundException,
IllegalAccessException,
InstantiationException {
@SuppressWarnings("rawtypes")
Class handlerClass = Class.forName(handlerImplFqcn);
return (RestHandler<?>) handlerClass.newInstance();
}
版本 3:
public static RestHandler<?> create(final String handlerImplFqcn) throws ClassNotFoundException,
IllegalAccessException,
InstantiationException {
Class<?> handlerClass = Class.forName(handlerImplFqcn);
return (RestHandler<?>) handlerClass.newInstance();
}
我的问题是,为什么它们都有效,哪一个是最佳实践?
使用版本 1。
版本 2 使用原始类型 - 尽可能避免使用这些类型。
版本 3 使用 <?>
这通常也是一种反模式,因为它很少能达到您想要达到的目的。
版本 1,重写为:
public static <T extends RestHandler<?>> RestHandler<T> create(final String handlerImplFqcn) throws ClassNotFoundException, IllegalAccessException, InstantiationException, ClassCastException {
Class<T> handlerClass = (Class<T>) Class.forName(handlerImplFqcn);
return (RestHandler<T>) handlerClass.newInstance();
}