2015-10-11 49 views
0

我认为Scala var类型很酷,有助于避免大量的技术代码,并且可以专注于功能。但是,我现在面对一些非常奇怪的事情。当我编译我的程序,我从sbt得到一个错误信息:Scala var类型使用导致类型不匹配

type mismatch; 
found: java.sql.Connection 
required: String 

this.conn = DriverManager.getConnection(
            ^

请注意,编译器指向类的conn属性,这个属性在类的定义,像这样:

class Db{ 
    private var conn = "" 

    .... 
} 

那么,为什么编译器会关心类型匹配,如果它是Scala并且我使用的是var数据类型?

+0

我从'sbt'提供了一个完整的错误信息。 – Jacobian

+0

对不起,我期望的消息是在'^' – Paul

回答

5

var不是数据类型。它是用于声明和定义可变变量的关键字。该类型不是动态的 - 它仍然是在编译时推断的。在这种情况下conn被推断为一个String,这是完全等同于编写

private var conn: String = "" 

Scala的类型系统的整点是不允许周围路过不兼容的类型。这是失败的,因为很显然,您不能将一个SQL连接分配给String类型的变量。类型推断不允许你忽略对象的类型,它只是让编译器在可能的情况下找出它。

2

var不是数据类型,它是用于在Scala中定义变量的一个关键字。另一个是val。是否使用varval仅影响您定义的变量是否可以重新分配给(var)或是只读(val)。无论如何,它不会影响变量的类型。

不管你是否使用varval,变量的类型是明确指定(由变量名称后写: theType)或推断隐式地从值分配它。

在您的示例中,您没有明确提供类型,因此推断类型为String,因为它是conn的类型。

+0

哦,我明白了。我只是认为用'Scala'中的'var'我可以拥有一些我不能在'Java'中创建的东西 - 为我想要的任何类型分配一个变量,并在运行时在类型之间切换。 – Jacobian