java - 转换为 Java 中的通用子类

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

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

Type safety: Unchecked cast from capture#4-of ? to T

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

最佳答案

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

尝试一下:

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

安全版本应该是这样的

static <T> T makeObject(Class<T> clazz) throws Exception {
    return clazz.getConstructor().newInstance();
}

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

关于java - 转换为 Java 中的通用子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59435545/

相关文章:

java - Android Instrumented Tests 覆盖范围排除苍蝇

java - 从现有的 ParameterizedType 创建另一个类的参数化类型

java - 将静态方法作为参数发送并在 Java 中的另一个方法中进行一般调用

将 void* 转换为其他类型

类型转换 `arrayfire::Array`

java - results.next() == false 并且没有打印数据

java - Android 共享元素转换不适用于不同的 img 比例类型

swift - 为什么我们需要显式地将可选类型转换为 Any?

java - 增加代号一中的字体大小?

java - 如何使 cxf jax-rs response.readEntity 成为通用的