2017-03-24 11 views
1

私が理解する限り、objectは単なるシングルトンインスタンスです。私は、セル型で列挙型を作成し、次に座標と列挙型を含むコンストラクタを使用してclass Cellを作成したいと考えています。しかし、それはできません、なぜ私は見つけることができません。別のファイルでなぜScalaクラスはコンストラクタでオブジェクト型のパラメータを持つことができないのですか?

object CellType extends Enumeration { 
    val Empty, X, O = Value 
} 

class Cell(column: Int, row: Int, cellType : CellType) { 
} // CellType is an object, and it doesn't work! 

あなたはどのようにそれを行うために、任意のアイデアを持っている、あるいは少なくともその理由はなぜScalaはcontructorsでオブジェクトを禁じますか?

エラーメッセージ:

警告:(3、37)インポート 'CellType' は永久的にパッケージモデルインポート de.htwg.model.CellType

+2

エラーメッセージはありますか?質問に追加してください。 – GhostCat

+0

良い点!説明 – mrek

+0

メッセージが追加されました。このエラーメッセージは、問題がどこから来るかを誤解している、追加されたインポート(おそらくIDEの自動インポート機能からのもの)にあります。これは、あなたがあなたのパッケージにある値のような識別子を既に持っている間に、この識別子があなたの署名の型を持っているので、IDEがタイプ 'CellType'をインポートしようとしているからです。 –

答えて

3
のオブジェクトCellTypeの 定義によって隠されています

CellTypeは型ではなく、オブジェクトです。実際にはそのタイプの唯一のオブジェクト、CellType.typeです。このオブジェクトのみが可能な関数の引数を使用する場合は、タイプCellType.typeの引数を使用できます。しかし、なぜそれが議論としてそれを置くことを悩ますのであれば、それはCellTypeにしかなりませんか?オブジェクトを直接引数として渡すことはできません。

CellTypeのタイプではなく、その列挙値のタイプ(CellType.Value)が必要です。

NB:私が個人的にScalaの言語が同じレベルtrait Sとシングルトンタイプのインスタンスであるタイプであるclass ES、およびobject S、上に定義されていることむしろ妨害を見出しました。このような見かけのアナロジーに間違えてはいけません。実際には、オブジェクトを値として、クラスや特性をタイプと見なしてください。

関連する問題