2015-10-11 123 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