2016-08-13 6 views
0

私はスカラーのシングルトンオブジェクトについてthe articleを読んでいますが、それがクラスのインスタンスであるかどうかを知ることはできませんでした。 次の簡単なプログラムは、この特定のケースのためにそれが本当だと伝えます:コンパニオンは常にクラスのインスタンスですか?

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は、常に本体がobject定義の本体である匿名クラスのインスタンスです。定義にextends句が含まれていない場合、そのクラスはAnyRefから直接継承されます。

TestMatchオブジェクトがTestMatchクラスのインスタンスになる唯一の方法は、object TestMatch extends TestMatch(something) {...}と書いた場合です。あなたがそれをしなかったので、TestMatchはあなたのコードにTestMatchのインスタンスではありません。

PS:テストコードの警告が表示されるのは、Scalaがすでにコンパイル時にTestMatchの型を正確に知っているからです。ランタイムテストではfalseしか得られません。このように "無駄"です。一般的に、実行時型テストは、実行時まで何かの正確な型が決まらず、テストが真または偽である可能性がある場合に使用します。

+2

Nitpick: 'AnyRef'から、' Any'からではありません。 –

+0

@AlexeyRomanov固定、ありがとうございます。 – sepp2k

関連する問題