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

时间:2015-02-04 11:00:29

标签: java generics raw-types unbounded-wildcard parameterized-class

我有一个参数化的界面RestHandler。

public interface RestHandler<T> {
   blah blah blah...
}

我需要使用Class.forName从config创建一个类。现在我想出了三个版本,ALL编译成功。

版本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();
}

我的问题是,为什么他们全部工作,哪一个是最佳实践?

2 个答案:

答案 0 :(得分:2)

版本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();
}

答案 1 :(得分:0)

使用版本1.

版本2使用原始类型 - 尽可能避免使用这些类型。

版本3使用<?>,这通常也是一种反模式,因为它很少达到您的意图。