我想实现类,它描述了有关设置某些选项值的操作。我想使option的值类型成为option类型的后缀。我正在努力做到这一点:
case class SetOptionMessage[T <: BaseOptionType](
option: T
value: Option[T#ValueType]
)
abstract class BaseOptionType {
type ValueType
}
object SomeBooleanOption extends BaseOptionType {
final type ValueType = Boolean
}
但是当我尝试使用这样的类时:
val msg = SetOptionMessage(SomeBooleanOption, Some(true))
我收到编译错误:
Error:(15, 43) type mismatch;
found : Some[Boolean]
required: Option[?#ValueType]
SetOptionMessage(SomeBooleanOption, Some(true))
^
如何正确引用嵌套类型?
case class SetOptionMessage[V, T <: BaseOptionType{ type ValueType = V }](
option: T,
value: Option[V]
)
val msg = SetOptionMessage(SomeBooleanOption, Some(true))
// msg: SetOptionMessage[Boolean,SomeBooleanOption.type] = SetOptionMessage(SomeBooleanOption$@2e93ebe0,Some(true))
case class SetOptionMessage[V, T <: BaseOptionType](
option: T,
value: Option[V])(implicit e: V =:= T#ValueType)
SetOptionMessage(SomeBooleanOption, Some(true))
// SetOptionMessage[Boolean,SomeBooleanOption.type] = SetOptionMessage(SomeBooleanOption$@2e93ebe0,Some(true))
SetOptionMessage(SomeBooleanOption, None)
// SetOptionMessage[SomeBooleanOption.ValueType,SomeBooleanOption.type] = SetOptionMessage(SomeBooleanOption$@2e93ebe0,None)
您不能使用case class
此解决方案。
class SetOptionMessage[T <: BaseOptionType](option: T)(val value: Option[T#ValueType])
val msg = new SetOptionMessage(SomeBooleanOption)(Some(true))
// SetOptionMessage[SomeBooleanOption.type] = SetOptionMessage@7f216e0c
msg.value
// Option[SomeBooleanOption.ValueType] = Some(true)
不要使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句