抽象枚举类型及其值的方法

Posted

技术标签:

【中文标题】抽象枚举类型及其值的方法【英文标题】:Method to abstract enum type and its value 【发布时间】:2022-01-15 12:33:43 【问题描述】:

我有这两个枚举:

enum Season:
  case Warm, Cold

enum Territory:
  case Continente, Madeira, Açores

我想创建一个方法radioInputsFor,它接收枚举类型和具体的枚举值,以使这些调用有效:

radioInputsFor(Season, Season.Warm)
radioInputsFor(Season, Season.Cold)
radioInputsFor(Territory, Territory.Madeira)

而且这些无效:

radioInputsFor(Season, Territory.Madeira)
radioInputsFor(Territory, Season.Cold)

我还想在方法内的第一个参数上调用.values

我应该为参数使用哪些正确的泛型和类型?

这个

def radioInputsFor[T <: Enum](default: T): T = default

正确地将第一个参数限制为枚举值。但是我找不到合适的类型来抽象枚举类型。

编辑:目前这是不可能的。但是this PR 正在添加所需的功能。

【问题讨论】:

枚举类型的伴侣似乎没有扩展任何特殊的东西。出于好奇,同时接受枚举和同伴作为参数的用例是什么?也就是说,你会用values做什么? 我想为枚举的每种情况(使用values)创建一个无线电输入(在ScalaJS中),第二个参数(一个特定的枚举情况)将是要检查的无线电输入默认。接收枚举类型也可以让我得到它的名字。我有 3 个不同的不相关枚举,我想为其生成无线电输入。 【参考方案1】:

正如mentioned here 一样,目前似乎没有enum 伴随对象的通用接口。

您可以退回到反射:

import reflect.Selectable.reflectiveSelectable
def pointedEnum[E <: reflect.Enum](
  companion:  def values: Array[E] ,
  value: E
): (List[E], E) =
  (companion.values.toList, value)

def demo() =
  pointedEnum(Season, Season.Warm)
  pointedEnum(Territory, Territory.Madeira)
  // pointedEnum(Season, Territory.Madeira) // Nope
  // pointedEnum(Territory, Season.Cold) // Nope

【讨论】:

以上是关于抽象枚举类型及其值的方法的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体及其内存对齐枚举联合的介绍

java枚举

delphi枚举类型值的问题

c#枚举类型操作方法总结-1

策略枚举

具有默认枚举值的枚举类方法失败