抽象枚举类型及其值的方法
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
【讨论】:
以上是关于抽象枚举类型及其值的方法的主要内容,如果未能解决你的问题,请参考以下文章