我要实现类,该类描述了有关设置某些选项值的操作。我想让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
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用这样的类时:
val msg = SetOptionMessage(SomeBooleanOption, Some(true))
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:
Error:(15, 43) type mismatch;
found : Some[Boolean]
required: Option[?#ValueType]
SetOptionMessage(SomeBooleanOption, Some(true))
^
Run Code Online (Sandbox Code Playgroud)
如何正确引用嵌套类型?
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))
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
您不能使用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)
Run Code Online (Sandbox Code Playgroud)
不要使用它。