参数化类 : Unbounded Wildcards vs Raw Type 的 Java 泛型

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

我有一个参数化接口(interface) RestHandler。

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

我需要使用 Class.forName 从配置中创建一个类。现在我想出了三个版本,它们都编译成功。

版本 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,重写为:

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

关于参数化类 : Unbounded Wildcards vs Raw Type 的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28319662/

相关文章:

java - 从 Intent Service 更新 Activity UI?

java - hibernate/jpa 忽略@XxxToOne 关系中的 LAZY FETCHING

java - 以最佳性能将图像写入 servlet 响应

java - 使用反射的通用构建器模式类

java - 尝试将 hashmap getValue() 解析为 int 时出错

java - 扩展现有 JDK 接口(interface)的默认方法

ios - 具有 self 类型转换的 Swift 通用扩展

java - 泛型类型参数构造函数

java - 作为原始类型 Comparator 的成员对 Compare(T,T) 进行未经检查的调用

java - 为什么不使用 Set<String> set = new HashSet() 而不是 Set<String> set = new HashSet<String>()?