在 Java 中转换为泛型子类

Vla*_*yin 1 java generics casting

我想编写通用函数,它可以通过名称创建任何类型的对象并将其作为自己的类型返回,而不是作为对象类型。

import java.lang.reflect.Constructor;
public class Test{
    static <T extends Object> T makeObject(String className) {
        try {
            Class<?> c = Class.forName(className);
            Constructor<?> constructor = c.getConstructor();
            Object object = constructor.newInstance();
            return (T)c.cast(object);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String[] args) {
         //without casting
         String obj = makeObject("java.lang.String");
         System.out.println(obj.getClass());
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我收到警告

Type safety: Unchecked cast from capture#4-of ? to T
Run Code Online (Sandbox Code Playgroud)

如何在不添加的情况下解决问题@SuppressWarnings("unchecked")

Dic*_*ici 6

如果您希望这是安全的,您需要将类作为参数传递,否则您将无法获得想要的东西。您的代码将编译我要求的返回类型,但如果类型不兼容,则会在运行时失败。

试试看:

String s = makeObject("java.lang.String"); // compiles and runs
Integer i = makeObject("java.lang.String"); // compiles but fails at runtime with java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Run Code Online (Sandbox Code Playgroud)

一个安全的版本看起来像这样

static <T> T makeObject(Class<T> clazz) throws Exception {
    return clazz.getConstructor().newInstance();
}
Run Code Online (Sandbox Code Playgroud)

但这表明您已经知道您想要什么类型,而不仅仅是从文件或其他东西中获取类名。