2016-08-31 8 views
0

特性セットを継承するクラスはたくさんあります。 HashSet、TreeSetなどなぜクラスセットがスカラーに存在しないのですか?

オブジェクトがあります(これはクラスセットのコンパニオンオブジェクトではありませんか?クラスセットのコンパニオンオブジェクトではありませんか?)。セットと特性セット。

このリストにもう1つのクラス「セット」を追加するだけで、構造を理解するのが本当に簡単に思えるようです。

クラスセットが存在しない理由はありますか?

+0

私はあなたが欠けているものは表示されません。このクラスを何に使うのですか?あなたはそれを「構造」にどこに入れますか? – Bergi

+0

私はObject Set.applyの結果の型があいまいだと思います。 オブジェクトSet.applyの結果には型セットがあり、scalaインタプリタはそれが型セットを持っていると言っていますが、本当にどのクラスですか? 私はscalaがJavaインターフェイスと全く同じではないことを知っていますが、私自身がクラスになりうるとは思わないのですが、間違っていますか? – user3293793

+0

特性はJavaインターフェースに似ています...より多目的です。 –

答えて

1

Scalaでは、クラスと特性の間に重複はありません。クラスはインスタンス化できる実装ですが、特性は独立して混合可能なインタフェースです。 Set.applyを使用すると、Setインターフェイスを持つオブジェクトが提供され、それを使用するために必要なことはすべて必要です。具体的なタイプがほしいと思っていますが、それは不要です。ここで行うべき正しいことは、set型のvalにそれを保存し、Setが提供するインタフェースのみを使用することです。

私はそれが満足できるものではないかもしれないが、それが時間を与えることを知っています。そして、それがJavaとは異なる場合であっても、Scala型システムはそれ自身で意味をなさないでしょう。

3

セットが必要な場合は、Set.applyにセットを依頼してください。これで完了し、満足しています。有効なセットがサポートされている必要があります。ほとんどの用途でうまく動作するように準備されています。

一方、特定の操作のパフォーマンスが重要な場合は、セットの具体的な実装のための具体的なクラスを作成すると、あなたが持っているものを正確に知ることができます。 Javaで

次のように記述します。

Set<String> strings = new HashSet<>(Arrays.asList("a", "b")); 

をScalaであなたが同様にこれらのタイプ

val strings: Set[String] = HashSet("a", "b") 

を持つことができますが、あなたが心配する必要がない場合、あなたにも便利なファクトリを使用することができますタイプと単純に使用

val strings = Set("a", "b") 

これは間違っていますが、別のクラスを追加する方法はわかりませんまったく助けになるだろう。インターフェース/特性と具体的な実装を持つのは普通のことですが、途中で何もあなたにとって必要ないし、役に立たないものはありません。

Set.applyは、セットの工場です。 getClassを使用して、結果のオブジェクトの実際のクラスを確認できます。この工場は、サイズ0-4のための特別な、最適化されたセットを作成する例大きなセットのための

scala.collection.immutable.Set$EmptySet$ 
scala.collection.immutable.Set$Set1 
scala.collection.immutable.Set$Set2 

のためには、ハッシュセット、すなわちscala.collection.immutable.HashSet$HashTrieSetです。

関連する問題