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
}

但是当我尝试使用这样的类时:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在泛型类型的泛型类上访问类型参数

来自分类Dev

Scala:类型与嵌套泛型不匹配

来自分类Dev

具有泛型的Scala类型类

来自分类Dev

Scala 自类型和泛型类

来自分类Dev

在泛型类隐式类型参数

来自分类Dev

为什么Scala不从泛型类型参数推断类型?

来自分类Dev

为什么Scala不从泛型类型参数推断类型?

来自分类Dev

Scala:泛型的类型推断及其类型参数

来自分类Dev

强制泛型类型参数为类类型?

来自分类Dev

从泛型类型类确定方法参数类型

来自分类Dev

泛型类型,其类型参数是抽象基类

来自分类Dev

泛型java函数使用的“类型参数”的“类类型”

来自分类Dev

如何将类型参数传递给泛型类构造函数引用?

来自分类Dev

如何将类型参数传递给泛型类构造函数引用?

来自分类Dev

使用类的实例获取类的泛型类型参数的数量?

来自分类Dev

返回泛型类型,它是基于传递给参数的类型的特定集合

来自分类Dev

返回泛型类型,它是基于传递给参数的类型的特定集合

来自分类Dev

从嵌套类型推断泛型

来自分类Dev

如何在泛型方法中引用类型参数的值

来自分类Dev

泛型类型参数C#-如何泛型类返回类型

来自分类Dev

尝试实例化自引用泛型类的实例时,如何处理自引用类型参数

来自分类Dev

Scala检查泛型类型

来自分类Dev

Scala中的泛型类型

来自分类Dev

Scala 忽略泛型类型

来自分类Dev

如何在类内引用嵌套模板参数的嵌套类型?

来自分类Dev

Scala泛型:如何声明类型必须为case类?

来自分类Dev

Scala从泛型类型实例化具体类

来自分类Dev

从参数推断泛型类型

来自分类常见问题

从泛型类中的类型参数创建新对象

Related 相关文章

热门标签

归档