gpt4 book ai didi

java - 返回一个 Class 实例及其泛型

转载 作者:搜寻专家 更新时间:2023-10-30 21:08:43 26 4
gpt4 key购买 nike

这是一个简单示例,演示了我遇到的与类型删除相关的问题。我有这样一个类:

public abstract class AbstractHandler<T> {

...
public abstract Class<T> handledType();
}

然后我有这个实现:

public class ConcreteHandler extends AbstractHandler<Map<String, List<Thing>>> {

@Override
public Class<Map<String, List<Thing>>> handledType() {
//what do I return here?!
}
}

我不能返回Map<String, List<Thing>>.class ,因为这在语法上什至无效。我尝试将子类型中的通用类型参数设置为 HashMap<String, List<Thing>>然后返回 new HashMap<String, List<Thing>>().getClass() ,但这不起作用,因为 Class<T>#getClass() 的返回类型是Class<? extends T> .我看了 TypeToken 来自 Guava,以及 getRawType方法看起来很有希望,但它返回 Class<? super T> .

我暂时有一个解决方法,看起来像这样:

public class ThingListMap {
private Map<String, List<Thing>> thingListMap;

...
}

我只使用 ThingListMap作为通用类型参数。

另一种可能的解决方法是执行强制转换:

public Class<Map<String, List<Thing>>> handledType() {
return (Class<Map<String, List<Thing>>>) new HashMap<String, List<Thing>>().getClass();
}

有没有更优雅的方法来做到这一点?

编辑:针对其中一个答案,我无法更改 handledType 的签名方法,因为我不拥有或控制它的来源。

最佳答案

出于某种原因,Java 不允许您转换 Map.class直接到Class<Map<String, List<Thing>>> .无论如何,这是一个未经检查的类型转换。

但是两次施法是合法的,第一次是Class<?> , 然后到 Class<Map<String, List<Thing>>> .

return (Class<Map<String, List<Thing>>>) (Class<?>) Map.class;

作为未经检查的类型转换,您可能需要添加 @SuppressWarnings("unchecked") .

关于java - 返回一个 Class 实例及其泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29660792/

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