我认为Scala var
类型很酷,有助于避免大量的技术代码,并且可以专注于功能。但是,我现在面对一些非常奇怪的事情。编译程序时,我收到来自sbt
的错误消息:
type mismatch;
found: java.sql.Connection
required: String
this.conn = DriverManager.getConnection(
^
请注意,编译器指向类的conn
属性,并且此属性在类中定义如下:
class Db{
private var conn = ""
....
}
那么,为什么编译器关心类型匹配,如果它是Scala
并且我使用var
数据类型?
答案 0 :(得分:5)
var
不是数据类型。它是用于声明和定义可变变量的关键字。类型不是动态的 - 它仍然是在编译时推断出来的。在这种情况下,conn
被推断为String
,它与写作完全相同
private var conn: String = ""
Scala的类型系统的重点是禁止传递不兼容的类型。它失败了,因为很明显,您无法将SQL连接分配给String
类型的变量。类型推断不允许您忽略对象的类型,它只是让编译器尽可能地计算出来。
答案 1 :(得分:2)
var
不是数据类型,它是用于在Scala中定义变量的一个关键字。另一个是val
。您使用var
还是val
只会影响您定义的变量是重新分配给(var
)还是只读(val
)。它无论如何都不会影响变量的类型。
无论您使用var
还是val
,都要明确指定变量的类型(通过在变量名后面写: theType
)或从您指定的值隐式推断变量的类型它来。
在您的示例中,您未明确提供类型,因此推断类型为String
,因为它是conn
的类型。