Generics Kotlin:在泛型集合中存储和调用带有类型参数的函数
我正在用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
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>`