Generics Kotlin:在泛型集合中存储和调用带有类型参数的函数

Generics Kotlin:在泛型集合中存储和调用带有类型参数的函数,generics,kotlin,covariance,rules,contravariance,Generics,Kotlin,Covariance,Rules,Contravariance,我正在用Kotlin编写简单的专家系统。让我们从事实开始。我实现了Fact如下: data class Fact<T>(val id: String, val value: T) data class Condition<T>(val id: String, val question: String, val evaluation: (T) -> Boolean) class Rule( val conditions: Set<Co

我正在用Kotlin编写简单的专家系统。让我们从事实开始。我实现了
Fact
如下:

data class Fact<T>(val id: String, val value: T)
data class Condition<T>(val id: String, val question: String, val evaluation: (T) -> Boolean)
class Rule(
            val conditions: Set<Condition<out Any>>,
            val conclusion: Fact<out Any>
           )
这样我就可以存储听起来像是18岁或更高年龄的条件

我的实施如下:

data class Fact<T>(val id: String, val value: T)
data class Condition<T>(val id: String, val question: String, val evaluation: (T) -> Boolean)
class Rule(
            val conditions: Set<Condition<out Any>>,
            val conclusion: Fact<out Any>
           )

由于输入参数为Nothing,因此我无法对评估事实使用评估函数。(我无法将该函数应用于任何内容)。我读了很多关于方差的书,试着用
out
in
玩,但没有任何帮助

地图逻辑应该做什么还不清楚<代码>条件没有
,只有
事实
有。你能澄清一下这部分吗?@Alexeysohin谢谢你的评论,我修正了。现在我希望您在编写
条件
时能够清楚地看到,
条件
只能吐出
任何
,但是
T
参数出现在
位置。因此,您唯一可以传递的是
Nothing
,即Nothing。尝试将
移出
@gpunto遗憾的是,它也不起作用,因为在装入
条件集时类型不匹配(必需:
SetWell),这无法起作用,因为例如,函数
(Int)->Bool
不等于函数
(Any)->Bool
。第一个函数只接受
Int
s。对于不知道实际类型的函数集合,您的用例是什么?使用
规则是否更好?
class Rule(
            val conditions: Set<Condition<out Any>>,
            val conclusion: Fact<out Any>
           )
val evaluationFuns = listOfRules[0].conditions.map{it.evaluation} // the type is `List<(Nothing)->Boolean>`