用泛型在Java中编码类型约束

用泛型在Java中编码类型约束,java,generics,types,casting,Java,Generics,Types,Casting,我正在制作一个系统,其中生产者模块产生事件,消费者模块消费这些事件。路由器类将每个生产者生成的事件发送到其消费者列表。有不同类型的事件,因此生产者和消费者类都由一个通用的“EventType”参数化 在我的路由器代码中,我有一个链接生产者和消费者的哈希图。我想表达一个约束,即给定生产者的每个消费者必须使用该生产者生产的相同EventType(但表中不同生产者的EventType可能不同) 目前,在我的Router类中,我将HashMap声明为: Map<Producer, List<

我正在制作一个系统,其中生产者模块产生事件,消费者模块消费这些事件。路由器类将每个生产者生成的事件发送到其消费者列表。有不同类型的事件,因此生产者和消费者类都由一个通用的“EventType”参数化

在我的路由器代码中,我有一个链接生产者和消费者的哈希图。我想表达一个约束,即给定生产者的每个消费者必须使用该生产者生产的相同EventType(但表中不同生产者的EventType可能不同)

目前,在我的Router类中,我将HashMap声明为:

Map<Producer, List<Consumer>> src_to_consumers;
将src\u映射到消费者;
我想做点像

Map<Producer<EventType>, List<Consumer<EventType>>> src_to_consumers;
将src\u映射到消费者;
除非没有所有生产者/消费者集合对必须具有相同EventType的约束


有没有一种不用强制转换的方法可以做到这一点?

我认为将所有内容都存储在一个地图中并不是一个好主意。我相信你最好有其他选择。在这里,地图不是万能的。如果我是你,我会完全设计一个事件管理类,根据需要有尽可能多的成员。如果你能在一张地图上减少你所有的需求,那就去吧!只要保持开放的想法,你不局限于一个单一的对象,即使它模糊地看起来你可以

但是,已经有一些工具可以为您完成整个事件管理。它们被称为活动巴士。它们很多,搜索它们会得到很多结果,只需选择最适合您需要的一个即可。

最后:

无法在数据类型上添加此类型的约束。我所做的是创建一个新的对象类型“ModuleLink”,它(在我的例子中)绑定生产者和消费者,并创建它们的集合

class ModuleLinks<EventType>{
    Producer<EventType> producer;
    List<Consumer<EventType>> consumers;
    ...
    }
类模块链接{
生产者;
列出消费者名单;
...
}

然后,您可以制作
HashMap

你想把你所有的生产者和消费者都存储在同一张地图上吗?这不是必要的,但似乎是一种合理的方式。当生产者触发事件时,它将事件及其自己的ID发送到路由器,路由器将查找事件并将事件发送给消费者。这张地图似乎是一个合理的结构,但我有其他选择。这只是一个问题,以确定我的回答,因为你的问题在这方面相当模糊。但是你提供了我想要的信息,我会发布一个答案。我还应该注意,我必须能够动态切换路由方案(这是一个机器学习应用程序,有一个用于训练模式的连接方案,一个用于测试),否则我只会跳过路由器,直接将消费者绑定到生产者。嗯。。这一点值得商榷,但能够使用泛型路由类处理事情,而不是让每个生产者和消费者都有一个成员的类,这有一些优势。在我的例子中,我想将路由逻辑(根据实现情况,它可能以深度优先而广度优先的顺序处理事件)与连接逻辑(构建模块图)分离到不同的类中。但我想你说的是,如果我想要这个,我必须投下。@Peter好的,给你的答案,我相信我可能不够明确。你可以有一张地图,这不是问题所在。只需将所有约束放在您提供的API上,而不是映射上。