从Java中的对象获取泛型类型参数

从Java中的对象获取泛型类型参数,java,generics,Java,Generics,我可能对术语有错误,这无助于我用谷歌搜索答案,但问题归结为: 我有一组对象声明如下: public interface ActivationService<T extends Activator> { T getActivator(Item item); } Set<ActivationService>_activationServices = new HashSet<>(); 公共接口激活服务{ T getActivator(项目); } ,因

我可能对术语有错误,这无助于我用谷歌搜索答案,但问题归结为:

我有一组对象声明如下:

public interface ActivationService<T extends Activator> {
    T getActivator(Item item);
}
Set<ActivationService>_activationServices = new HashSet<>();
公共接口激活服务{
T getActivator(项目);
}
,因此集合的声明如下所示:

public interface ActivationService<T extends Activator> {
    T getActivator(Item item);
}
Set<ActivationService>_activationServices = new HashSet<>();
Set_activationServices=newhashset();
我想把它转换成地图,以便更容易地查找合适的“激活服务”


Map由于您的界面是
ActivationService
您可能需要使用
Set)

请注意,当使用这样的服务时,您最终需要使用一些强制转换,因为您所拥有的只是一个
激活服务。我恐怕您不能
设置
您在这里使用的是原始类型。顺便说一句,它应该是
设置
我本人从未使用过反射,但我认为它可以实现您想要的。检查此问题:。然而,我宁愿重新思考这个想法,也不愿使用这种反思,因为这种反思可能会在以后带来痛苦。当然,如果像Michael提到的那样使用原始类型是没有意义的。我知道存在不相关的激活器,这就是为什么我决定对它们的服务进行分组。我想我的问题是关于如何使用反射。
getActivatorClass
似乎返回了实现中已经存在的信息,比如为实现者暗示了一些额外的工作…@fedd是的,这是一些额外的工作,但是由于反射有它的警告,使用这样的方法似乎是最安全的方法。通过提供一个基类,该基类使用反射来提供该方法的实现,或者甚至在接口本身中提供一个默认实现(尽管我从未测试过这个),可以在一定程度上减轻工作量。@fedd关于类型参数的信息可能不在实现中。例如,它在
类GenericActivationService实现ActivationService
中不存在。