簡単なバージョンは、あなたが(あなたがインスタンス化することはできませんという)構造型のための型のエイリアスを作成したということです。これは、あなたが何をやったかの簡易版(動作しない)である
:
今
scala> import collection.mutable._
import collection.mutable._
scala> type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
defined type alias ObservableHashSet
scala> new ObservableHashSet[String]
<console>:12: error: class type required but scala.collection.mutable.HashSet[String] with scala.collection.mutable.ObservableSet[String] found new ObservableHashSet[String]
、エラーがいくつかの意味を作る、と私は理由を説明してみましょうありません。
type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
では、具体的なタイプではないタイプのエイリアスを定義しています(エラーメッセージに「クラスタイプ」ではないので)、new
でインスタンスを作成することはできません。
しかし、この(私たちはクラス型を作成行う中間段階では)動作しますので、
scala> class ObservableHashSet[T] extends HashSet[T] with ObservableSet[T]
defined class ObservableHashSet
scala> type obs[T] = ObservableHashSet[T]
defined type alias obs
scala> new obs[String]
res1: ObservableHashSet[String] = Set()
、質問です:なぜScalaは、あなたがインスタンス化することはできません型のエイリアスを作成してみましょうのでしょうか? まあ、type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
は構造タイプです。コードの最初のスニペットで見たように、インスタンスを作成することはできませんが、それを使用することはできます。関数の引数に構造的制約を置く。
scala> type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
defined type alias ObservableHashSet
scala> def test(obsHashSet: ObservableHashSet[String]) : String = {"bingo!"}
test: (obsHashSet: ObservableHashSet[String])String
scala> test(new HashSet[String] with ObservableSet[String])
res4: String = bingo!
をしかし、我々は、我々は型の不一致得る構造型に準拠していない引数でテストを呼び出そうとします:
は見てみましょう
scala> test(new HashSet[String])
<console>:13: error: type mismatch;
found : scala.collection.mutable.HashSet[String]
required: ObservableHashSet[String]
おかげパウロを。私は "タイプ"をマクロ置換の一種と考えていたと思います。構造型についてもう少し詳しくお読みになります。 thx – Richard
@リチャード:あなたのおかげです。私はあなたが "タイプ"を教えて実験する前に答えを知らなかった。有益だった。 –