代码之家  ›  专栏  ›  技术社区  ›  Martin Kröning

Drools分数计算中的不同泛型类型

  •  1
  • Martin Kröning  · 技术社区  · 7 年前

    我正在开发一个使用Optaplanner创建祭坛服务器时间表的程序。 该域在很大程度上源自护士排班示例。

    服务器请求了许多问题事实,例如:

    class DateOffRequest {
        private Server server;
        private LocalDate date;
    }
    

    class DayOffRequest {
        private Server server;
        private DayOfWeek day;
    }
    

    为了简化代码,我想用 AbstractMap.SimpleImmutableEntry

    问题是,不能像这样在Drools规则文件中指定泛型类的类型:

    rule "dateOffRequest"
        when
            Map.Entry<Server,LocalDate>($server : server, $date : date)
    ...
    

    它运行时没有指定类型,但Drools将使用各种请求来获取各种规则,因为他无法区分它们,这对我来说似乎不是很有效。

    我想把地图包起来。单独类中的条目并通过功能进行连接,但这将产生大量样板代码,并消除使用泛型的优势。

    如果可以指定规则要使用的问题事实集合,那就太棒了。我认为它类似于ValueRangeProviders指定ID的方式,但我没有找到实现这种行为的任何方法。

    有什么最佳实践来应对这种情况吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Geoffrey De Smet    7 年前

    这是由于Java的 具体化 泛型。这意味着如果 Map 实例在问题事实中,无法检测用于构造该实例的泛型类型 地图 例子泛型类型在运行时从java实例中删除。(请注意,泛型类型不会在运行时从方法签名中删除,但这是另一种情况)。

    解决方法:创建强类型组合类,例如 ServerLocalDatePair

        2
  •  0
  •   Martin Kröning    7 年前

    非常感谢您的回答!

    我会照你的建议做的。 事实上,我找到了一种非常干净的方法:

    public class DateOffRequest extends AbstractMap.SimpleImmutableEntry<Server, LocalDate> {
        public DateOffRequest(Server key, LocalDate value) {
            super(key, value);
        }
    }