Scala:引用类的嵌套类型,它是泛型的类型参数

Art*_*ner 5 scala

我要实现类,该类描述了有关设置某些选项值的操作。我想让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)

如何正确引用嵌套类型?

sen*_*nia 5

类型成员

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)

不安全的班级演员

不要使用它。