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

前端之家收集整理的这篇文章主要介绍了Scala:引用嵌套类的类,它作为泛型的类型参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想实现类,它描述了设置一些选项值的操作.我想让选项的值类型取决于选项类型.我想这样做:

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)

不安全的类演员

不要使用它.

猜你在找的Scala相关文章