使用多个类型参数和Nothing输入推断错误

时间:2015-07-07 21:46:41

标签: scala

我正在尝试为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编译器可以推断出类型吗?

1 个答案:

答案 0 :(得分:2)

您不在示例中使用类型T,并且摆脱它会修复您的类型推断问题:

case class Property[U](name: String,
                       propertyType: PropertyType[U],
                       nullable: Boolean = true,
                       maxLength: Option[Integer] = None,
                       defaultValue: Option[U] = None)