【问题标题】:Coding Type constraints in Java with Generics使用泛型在 Java 中编码类型约束
【发布时间】:2015-12-29 12:33:23
【问题描述】:

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

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

目前,在我的路由器类中,我将 HashMap 声明为:

Map<Producer, List<Consumer>> src_to_consumers;

我想做类似的事情

Map<Producer<EventType>, List<Consumer<EventType>>> src_to_consumers;

除了所有生产者/消费者-集合对必须具有相同的 EventType 的约束。

有没有办法在不强制转换的情况下做到这一点?

【问题讨论】:

  • 您想将所有生产者和所有消费者存储在同一张地图中吗?
  • 这不是必需的,但它似乎是一种合理的做事方式。当生产者触发一个事件时,它会将事件和它自己的 ID 发送给路由器,路由器查找它并将事件发送给消费者。地图似乎是一种合理的结构方式,但我对其他选择持开放态度。
  • 这只是我的回答的一个问题,因为您的问题对此相当模糊。但是您提供了我想要的信息,我会发布答案。
  • 我还应该注意,我必须能够动态切换路由方案(这是一个机器学习应用程序,有一个用于训练模式的连接方案和一个用于测试的连接方案),否则我会跳过路由器并将消费者直接绑定到生产者。

标签: java generics types casting


【解决方案1】:

我认为将所有内容都存储在一个地图中并不是一个好主意。我相信你有替代品会更好。地图在这里不是万能的。如果我是你,我会完全设计一个包含尽可能多的成员的事件管理类。如果您可以在一张地图中减少所有需求,请继续!只要保持开放的想法,即您不仅限于单个对象,即使它模糊地看起来您可以。

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

【讨论】:

  • 嗯.. 点了,但是能够使用通用路由类而不是每个生产者和消费者都有一个成员的类来处理事情有一些优势。在我的情况下,我想将路由逻辑(根据实现可能以深度优先与广度优先顺序处理事件)与连接逻​​辑(构建模块图)分离到不同的类中。但我猜你的意思是,如果我想要这个,我必须投射。
  • @Peter 好的,鉴于您的回答,我相信我可能不够明确。你可以有一张地图,这不是问题。只需将所有约束放在您提供的 API 上,而不是地图上。
【解决方案2】:

最后:

无法在数据类型上添加这种类型的约束。我所做的是创建一个新的对象类型“ModuleLinks”,它(就我而言)绑定生产者和消费者,并制作它们的集合。

class ModuleLinks<EventType>{
    Producer<EventType> producer;
    List<Consumer<EventType>> consumers;
    ...
    }

然后您可以创建您的HashMap&lt;Producer, ModuleLinks&lt;EventType&gt;&gt;

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多