gpt4 book ai didi

java - 我可以反射性地实例化 java 中的泛型类型吗?

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:07 24 4
gpt4 key购买 nike

是否可以在 Java 中反射性地实例化泛型类型?使用描述的技术 here我得到一个错误,因为类标记不能是通用的。以下面的例子为例。我想实例化一些实现 Creator 的 Creator 子类。实际的类名作为命令行参数传入。这个想法是能够在运行时指定 Creator 的实现。还有其他方法可以完成我在这里尝试做的事情吗?

public interface Creator<T> {
T create();
}
public class StringCreator implements Creator<String> {
public String create() { return new String(); }
}
public class FancyStringCreator implements Creator<String> {
public String create() { return new StringBuffer().toString(); }
}
public static void main(String[] args) throws Exception {
Class<?> someClass = Class.forName(args[0]);
/*ERROR*/Class<? extends Creator<String>> creatorClass = someClass.asSubclass(Creator.class);
Constructor<? extends Creator<String>> creatorCtor = creatorClass.getConstructor((Class<?>[]) null);
Creator<String> creator = creatorCtor.newInstance((Object[]) null);
}

编辑:我喜欢 Marcus 的方法,因为它是最简单实用的方法,没有绕过整个泛型问题。我可以在我的情况下使用它,因为我可以指定传递的类必须是 StringCreator 的子类。但正如 Ericson 指出的那样,泛型信息仍然存在于类型级别,只是不存在于运行时级别,因此仍然可以反射(reflection)性地检查给定类是否实现了正确的泛型类型。

最佳答案

一般信息在运行时丢失。没有与 Creator .class 等效的运行时。您可以在 Creator 和 StringCreator 之间创建一个类型来修复通用类型:

public interface Creator<T> {
T create();
}
public interface StringCreator extends Creator<String> { }
public class StringCreatorImpl implements StringCreator {
public String create() { return new String(); }
}
public class FancyStringCreator implements StringCreator {
public String create() { return new StringBuffer().toString(); }
}
public static void main(String[] args) throws Exception {
Class<?> someClass = Class.forName(args[0]);
Class<? extends StringCreator> creatorClass = someClass.asSubclass(StringCreator.class);
Constructor<? extends StringCreator> creatorCtor = creatorClass.getConstructor((Class<?>[]) null);
Creator<String> creator = creatorCtor.newInstance((Object[]) null);
}

但是当然你失去了一点灵 active ,因为你不能使用下面的创建者类:

public class AnotherCreator implements Creator<String> {
public String create() { return ""; }
}

关于java - 我可以反射性地实例化 java 中的泛型类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/356583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com