2011-11-07 7 views
11

ObservableSetで混合して新しいタイプを作成した後、HashSetで新しいタイプを使用できるようになりました。以下の "foo"のようにしかし、これはコンパイルされませんが、元の長い形式の形式を使用しても問題はありません(下の「バー」で示されています)。タイプエイリアスのインスタンスを作成すると、「クラスタイプが必要です」というエラーが発生します

これは単なる言語の機能ですか、何か不本意なことはありますか?

package whatever 

import collection.mutable._ 
object Whatever { 

    type ObservableHashSet[T] = HashSet[T] with ObservableSet[T] 
    class X 


    def foo { 
     new ObservableHashSet[X] 
    } 

    def bar { 
    new HashSet[X] with ObservableSet[X] 
    } 
} 

エラーが..です

error: class type required but scala.collection.mutable.HashSet[scala.Whatever.X] with scala.collection.mutable.ObservableSet[scala.Whatever.X] found 
new ObservableHashSet[X] 

答えて

13

簡単なバージョンは、あなたが(あなたがインスタンス化することはできませんという)構造型のための型のエイリアスを作成したということです。これは、あなたが何をやったかの簡易版(動作しない)である

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] 
+0

おかげパウロを。私は "タイプ"をマクロ置換の一種と考えていたと思います。構造型についてもう少し詳しくお読みになります。 thx – Richard

+0

@リチャード:あなたのおかげです。私はあなたが "タイプ"を教えて実験する前に答えを知らなかった。有益だった。 –

関連する問題