参数化类的Java泛型:无界通配符与原始类型

参数化类的Java泛型:无界通配符与原始类型,java,generics,raw-types,unbounded-wildcard,parameterized-class,Java,Generics,Raw Types,Unbounded Wildcard,Parameterized Class,我有一个参数化接口RestHandler public interface RestHandler<T> { blah blah blah... } 公共接口RestHandler{ 废话废话。。。 } 我需要使用class.forName从config创建一个类。现在我提出了三个版本,都编译成功了 第1版: @SuppressWarnings("unchecked") public static <T> RestHandler<T> create(

我有一个参数化接口RestHandler

public interface RestHandler<T> {
   blah blah blah...
}
公共接口RestHandler{
废话废话。。。
}
我需要使用class.forName从config创建一个类。现在我提出了三个版本,都编译成功了

第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();
}
@SuppressWarnings(“未选中”)
公共静态RestHandler create(最终字符串handlerImplFqcn)抛出ClassNotFoundException,
非法访问例外,
实例化异常{
Class handlerClass=Class.forName(handlerImplFqcn);
return(RestHandler)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();
}
公共静态RestHandler创建(最终字符串handlerImplFqcn)抛出ClassNotFoundException,
非法访问例外,
实例化异常{
@抑制警告(“原始类型”)
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();
}
公共静态RestHandler创建(最终字符串handlerImplFqcn)抛出ClassNotFoundException,
非法访问例外,
实例化异常{
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();
}

publicstatic我个人的偏好是第一个示例,尽管您不需要SuppressWarnings注释。尽管您应该注意到,在所有这些示例中也可能抛出ClassCastException。您的意思是
public static吗