【发布时间】:2022-02-05 11:33:48
【问题描述】:
我正在尝试创建一个不同配置的映射,其中每个配置都有一个给定的键对象和一些选项,例如
-
FirstConfig可以是:FirstConfigOptionAFirstConfigOptionB
-
SecondConfig可以是:SecondConfigOptionASecondConfigOptionB
- ...
而且我在 setter 函数的一般类型和签名方面遇到问题,因此它会在编译时检查我是否提供了正确的对象,例如
// 1. this should compile normally
set(FirstConfig, FirstConfigOptionA)
// 2. should NOT compile due to `SecondConfigOptionA` parameter not being a valid option for `FirstConfig`
set(FirstConfig, SecondConfigOptionA)
到目前为止,我的尝试仍然允许上面的第二种情况编译。
abstract sealed class Configuration
trait OptionKey[T <: Configuration] {}
trait OptionVariant[T <: Configuration] {}
// First Config
trait FirstConfig extends Configuration
object FirstConfigKey extends OptionKey[FirstConfig];
object FirstConfigOptionA extends OptionVariant[FirstConfig]
object FirstConfigOptionB extends OptionVariant[FirstConfig]
// Second Config
trait SecondConfig extends Configuration
object SecondConfigKey extends OptionKey[SecondConfig];
object SecondConfigOptionA extends OptionVariant[SecondConfig]
object SecondConfigOptionB extends OptionVariant[SecondConfig]
def set[T](k: OptionKey[T], v: OptionVariant[T]): Unit = {}
set(FirstConfigKey, FirstConfigOptionA)
set(FirstConfigKey, SecondConfigOptionA) // This still compiles
我也尝试过使用具有类似结果的枚举:
object FirstConfig extends Enumeration {
type FirstConfig = Value
val FirstConfigOptionA, FirstConfigOptionB = Value
}
object SecondConfig extends Enumeration {
type SecondConfig = Value
val SecondConfigOptionA, SecondConfigOptionB = Value
}
def set(k: Enumeration, v: Enumeration#Value): Unit = {}
set(FirstConfig, FirstConfig.FirstConfigOptionA)
set(FirstConfig, SecondConfig.SecondConfigOptionA) // This still compiles
表达配置与其可用选项之间的这种关系的正确方法是什么,或者应该使用set 的签名来强制执行它?
【问题讨论】:
-
你能在第一种情况下尝试这样的选项吗?
def set[T <: Configuration](k: OptionKey[T], v: OptionVariant[T]): Unit = {} -
不,这对我不起作用。无论如何,谢谢。
标签: scala generics types enumeration