gpt4 book ai didi

Java泛型——获取类的实例

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:47 24 4
gpt4 key购买 nike

我有一个名为 Data 的抽象类,它有一个 getInstance() 方法,该方法应该返回 Data 的具体子类的实例。

我想将一个字符串传递给 getInstance 方法,这个字符串将准确定义返回的类。

到目前为止我有:

public abstract class Data {

private Map<String, Data> instances;

public <T extends Data> T getInstance(Class<T> type, String dataName) {
return type.cast(instances.get(dataName));
}

}

getInstance() 方法在 instances 中查找正确实例的位置 map 。我认为如果 map 被填充(由 Spring),这应该没问题,但调用者必须匹配 Class<T> type参数与 String dataName参数。

有什么方法可以删除 Class<T> type参数并且没有泛型警告?

最佳答案

不,如果您在不知道该类型的运行时类的情况下尝试转换为泛型类型,您将始终收到警告。不,如果不将泛型类的实例作为参数提供,就无法获取泛型类的实例 - 泛型在运行时会被删除。

在没有显式转换的情况下没有警告的唯一方法是返回对象或数据(取决于您的 map )并要求用户进行转换:

public Data getInstance(String dataName) {
return instances.get(dataName);
}
// OR
public Object getInstance(String dataName) {
return instances.get(dataName);
}

在我看来,为了方便起见,最好同时提供这两种方法:Data getInstance(String)<T extends Data> T getInstance(Class<T>, String) .这本质上也是 OSGI 在 BundleContext 中所做的。类,因此可以获得服务引用,不同的是,不可能获得具有任意 ID 的服务(ID 始终是类的名称):

ServiceReference<?> BundleContext#getServiceReference(java.lang.String clazz) 
ServiceReference<S> BundleContext#getServiceReference(java.lang.Class<S> clazz)

关于Java泛型——获取类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22561869/

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