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

时间:2018-05-04 13:00:48

标签: java drools optaplanner

我正在开发一个使用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会对各种规则使用各种请求,因为他无法区分它们,这对我来说似乎不是很有效。

我想过将Map.Entries包装在单独的类中并通过功能连接,但这会产生很多样板代码并消除使用泛型的优势。

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

有没有最佳做法来应对这种情况?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

非常感谢您的回答!

我会按你的建议去做。 事实上,我发现了一种非常干净的方式:

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