我正在尝试为ADT建模以表示属性,并能够设置默认值。
所以,我的类型定义如下,所以我可以在类型上进行模式匹配:
trait PropertyType[U] {
def typeName: String
}
case object OInt32 extends PropertyType[Int] {
override def typeName: String = "Edm.Int32"
}
case object OString extends PropertyType[String] {
override def typeName: String = "Edm.String"
}
现在,属性本身由PropertyType
及其参数
case class Property[T <: PropertyType[U], U](name: String,
propertyType: T,
nullable: Boolean = true,
maxLength: Option[Integer] = None,
defaultValue: Option[U] = None)
如果两个参数都存在,则类型推断可以正常工作,即下面的代码编译正常:
val intProp = Property("Integer", propertyType = OInt32, defaultValue = Some(123))
val stringProp = Property("String", propertyType = OString, defaultValue = Some("123"))
此外,它阻止我尝试为指定的类型设置错误的默认值,因此以下内容将无法编译。
val stringProp = Property("String", propertyType = OString, defaultValue = Some(123))
我有推断的问题,如果我省略默认值或将其设置为None,编译失败,因为U类型无法推断:
val stringPropWithDefault = Property("String", propertyType = OString) //Doesn't compile
val stringPropWithDefault = Property[OString.type, String]("String", propertyType = OString) //Compiles
如果只有一个参数,scala编译器可以推断出类型吗?
答案 0 :(得分:2)
您不在示例中使用类型T,并且摆脱它会修复您的类型推断问题:
case class Property[U](name: String,
propertyType: PropertyType[U],
nullable: Boolean = true,
maxLength: Option[Integer] = None,
defaultValue: Option[U] = None)