2015-07-07 4 views
0

Я пытаюсь смоделировать 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 

Can Scala компилятором типа Infer, если только один параметр присутствует?

ответ

2

Вы не можете использовать тип T в ваших примерах, и избавиться от него будет исправить ваш тип логического вывода вопрос:

case class Property[U](name: String, 
         propertyType: PropertyType[U], 
         nullable: Boolean = true, 
         maxLength: Option[Integer] = None, 
         defaultValue: Option[U] = None) 
Смежные вопросы