为什么在定义默认参数值时需要输入?

时间:2015-03-11 04:31:01

标签: scala type-inference

使用默认参数值定义类时,为什么需要显式提供默认参数的类型?

例如:

scala> case class Person(name:String = "SomeOne")  
defined class Person

但是在未明确提供类型时遇到以下错误:

scala> case class Person(name = "SomeOne")  
<console>:1: error: ':' expected but '=' found.
   case class Person(name = "SomeOne")

有没有理由为什么类型推断系统无法识别默认参数值的类型?

1 个答案:

答案 0 :(得分:3)

在Scala中,以下所有声明均有效

case class AnyPerson(name: Any = "SomeOne")
case class StringPerson(name: String = "SomeOne")
case class CharSequencePerson(name: CharSequence = "SomeOne")

即便是这个也是有效的

implicit def stringToLenght(name: String) = name.length()

case class Person(name:Int = "SomeOne")

在这种情况下,名称默认值为7。

所以可能的选项数量是:

的总和
  1. 类型的所有继承
  2. Type
  3. 范围内的所有隐式转换

    让我们在你的代码中错误地说你正在做这样的事情:

    val person = AnyPerson()
    val anotherPerson = AnyPerson(name = person.name + 9)
    

    在这种情况下。你是否犯了一个错误,或者你给了编译器一个暗示,名称的真正含义是什么?

    语言可以让编译器对开发人员的含义进行假设。但这会使代码更难以阅读,理解,这对最终用户来说非常容易出错。