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

Java Drools分数计算中的不同泛型类型,java,drools,optaplanner,Java,Drools,Optaplanner,我正在开发一个程序,使用Optaplanner创建祭坛服务器时间表。 该域大部分来自护士排班示例 服务器请求的问题事实很多,例如: class DateOffRequest { private Server server; private LocalDate date; } 及 为了简化代码,我想用替换它们 问题是不能在Drools规则文件中指定泛型类的类型,如下所示: rule "dateOffRequest" when Map.Entry<Se

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

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

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

为了简化代码,我想用替换它们

问题是不能在Drools规则文件中指定泛型类的类型,如下所示:

rule "dateOffRequest"
    when
        Map.Entry<Server,LocalDate>($server : server, $date : date)
...
规则“dateOffRequest”
什么时候
Map.Entry($server:server,$date:date)
...
它运行时没有指定类型,但是Drools将使用各种类型的规则请求,因为他无法区分它们,这对我来说似乎不是很有效

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

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


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

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


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

非常感谢您的回答

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

public class DateOffRequest extends AbstractMap.SimpleImmutableEntry<Server, LocalDate> {
    public DateOffRequest(Server key, LocalDate value) {
        super(key, value);
    }
}
公共类DateOffRequest扩展了AbstractMap.SimpleImmutableEntry{
公共DateOffRequest(服务器密钥、LocalDate值){
超级(键、值);
}
}
public class DateOffRequest extends AbstractMap.SimpleImmutableEntry<Server, LocalDate> {
    public DateOffRequest(Server key, LocalDate value) {
        super(key, value);
    }
}