2016-08-13 67 views
0

我讀了the article關於scala中的單例對象,但是如果它是類的一個實例,沒有找到關於它的東西。 下面這個簡單的程序會告訴,對於這種特殊情況下這是真的:同伴是班級的常客嗎?

class TestMatch(val i: Int) 

object TestMatch{ 
    def apply(i: Int) = new TestMatch(i) 
    def unapply(tm : TestMatch): Option[Int] = Some(tm.i) 
} 

我試圖對其進行測試,因爲這:

println(TestMatch.isInstanceOf[TestMatch]) //false 

,但它產生的警告fruitless type test。 我不知道如何執行這樣的測試。

+0

不確定你在這裏證明什麼 - 如果你完全刪除對象,你仍然會得到相同的結果 - tm是類TestMatch的一個實例,這些都不涉及TestMatch伴侶目的。 –

+0

@TzachZohar是的,我只是注意到了這一點。但是最初的問題呢。伴侶對象的類型是什麼? – stella

+0

@TzachZohar我剛剛編輯了我的問題 – stella

回答

6

object s始終是匿名類的一個實例,其主體是object定義的主體。如果定義不包括extends子句,則該類直接從AnyRef繼承。

所以TestMatch對象可能是TestMatch類的一個實例的唯一方法是如果你寫了object TestMatch extends TestMatch(something) {...}。由於您沒有這樣做,因此代碼中的TestMatch不是TestMatch的實例。

PS:你要爲你的測試代碼警告的原因是,斯卡拉已經知道在編譯的時候到底是什麼的TestMatch的類型是什麼,所以它知道運行時間測試永遠只能導致false和因此「沒有結果」。一般情況下,如果在運行時間之前沒有確定確切類型的東西,那麼可以使用運行時類型測試,因此測試可能是真或假。

+2

Nitpick:來自'AnyRef',而不是'Any'。 –

+0

@AlexeyRomanov修正,謝謝。 – sepp2k