我想实现类,它描述了设置一些选项值的操作.我想让选项的值类型取决于选项类型.我想这样做:
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,Some(true)) SetOptionMessage(SomeBooleanOption,None) // SetOptionMessage[SomeBooleanOption.ValueType,None)
不同的参数组
您不能在此解决方案中使用案例类.
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)
不安全的类演员
不要使用它.