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

Different generic types in Drools score calculation

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

服务器请求的问题事实很多,例如:

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

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

为了简化代码,我想将它们替换为 AbstractMap.SimpleImmutableEntry

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

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

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

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

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

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

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

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

非常感谢您的回答!

我会按照你的建议去做的。 事实上,我找到了一种非常简洁的方法:

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