2016-09-03 42 views
-1

爲什麼不編譯?斯卡拉錯誤:構造函數被定義兩次

class Name(val name: Int, val sub: Int) { 

    def this() { 
    this(5, 5) 
    } 

    def this(name: Int) { 
    this(name, 5) 
    } 

    def this(sub:Int){ 
    this(5, sub) 
    } 
} 

錯誤:

.scala:15: error: constructor Name is defined twice 
    conflicting symbols both originated in file '.scala' 
    def this(sub:Int){ 
    ^

回答

2

你有兩個構造函數這是必不可少的一樣。

def this(name: Int) { 
this(name, 5) 
} 

def this(sub:Int){ 
this(5, sub) 
} 

每個構造函數的簽名應該不同,具有不同的變量名稱不會使這兩個構造函數不同。

2

它不會編譯,因爲您有兩個構造函數都將單個Int作爲參數。

要理解爲什麼這是一個問題,問問自己,如果你做了new Name(2)會發生什麼。是否應該和new Name(2,5)new Name(5,2)一樣?編譯器如何知道你想要哪一個?

這裏是你如何使用Scala的默認參數功能,做你想做的一個建議:

class Name(val name: Int = 5, val sub: Int = 5) 

new Name() 
new Name(2, 2) 
new Name(name=2) 
new Name(sub=2)