Kotlin 对象中的泛型

Kotlin 对象中的泛型,kotlin,generics,Kotlin,Generics,我有一个关于密封类、泛型和对象的问题 假设我想用一个密封类对3个有限案例进行建模,如下所示: 密封类变更状态{ 房地产(州:S):S } 数据类SetState(val newState:S):ChangeState(){ 覆盖乐趣减少(状态:S):S=新闻状态 } 对象NoStateChange:ChangeState(){//我在这里为ChangeState指定什么?什么都没有? 覆盖乐趣减少(状态:Nothing):Nothing{ 抛出异常(“不应调用此异常”) } } 我们的目标是提

我有一个关于密封类、泛型和对象的问题

假设我想用一个密封类对3个有限案例进行建模,如下所示:

密封类变更状态{
房地产(州:S):S
}
数据类SetState(val newState:S):ChangeState(){
覆盖乐趣减少(状态:S):S=新闻状态
}
对象NoStateChange:ChangeState(){//我在这里为ChangeState指定什么?什么都没有?
覆盖乐趣减少(状态:Nothing):Nothing{
抛出异常(“不应调用此异常”)
}
}
我们的目标是提供一种方便的方法,以通用的方式定义
NoStateChange
,它可以用于以下方面:

fun-foo(i:Int):变更状态{
如果(i==0)返回
NoStateChange//将不会编译,因为返回类型为ChangeState,但应为ChangeState
其他的
设定状态(一)
}

有没有一种方法可以用
对象
和泛型以某种方式做到这一点?

正如@Tenfour04所指出的,问题是需要
out
,但是
reduceState()
也需要
in
。但是,
reduceState()
可以从类层次结构中重构出来,并移动到如下扩展函数:

密封类变更状态
数据类SetState(val newState:S):ChangeState()
对象NoStateChange:ChangeState()
乐趣改变状态。减少(状态:S):S{
返回时间(val change=this){
是SetState->change.newState
是NoStateChange->state吗
}
}

如果
foo
的返回类型为
ChangeState
,则此操作有效。但是,
reduceState
将不能在返回值上调用。如果函数可以返回除可用的
SetState
之外的其他内容,则无法解决此问题。为什么不
null
而不是
NoStateChange
<代码>fun-foo(i:Int):变更状态?=如果(i==0)为空,则设置状态(i)
?@Tenfour04谢谢。我想我可以重构一些片段,使
reduceState()
函数脱离类,然后我认为它应该与