Scala没有将X解析为Y,即使X延伸Y.

时间:2014-01-11 02:31:38

标签: scala types type-mismatch traits mismatch

[见下面的代码片段] 我读到我的X是一块,我有一个需要一块的玩家。玩家Me试图用片段X来定义这件作品。然而,Scala并不认为X是一块,而是看到'X.type'。 X.type是什么意思?我不确定我的问题是什么,所以我很难搜索。

我不知道这是怎样的类型阴影[见Scala really weird Type Mismatch],因为我没有指定另一个'Piece',而是我只指定我需要'Piece'。

似乎有一些东西会阻止Scala将X解析为一块。

尝试REPL

trait Piece { val piece: Char }
case class X extends Piece { val piece: Char = 'X' }

trait Player { val piece: Piece }
case class Me extends Player { val piece: Piece = X }

结果

error: type mismatch;
 found   : X.type
 required: Piece
       case class Max extends Player { val piece: Piece = X }

4 个答案:

答案 0 :(得分:3)

这可能是因为X只是你描述了一个类(所以它实际上是一个类型),而Scala期待一个类型的对象(或实例)片。在第一种情况下,你会得到同样的错误:

case class X extends Piece { val piece: Char = Char }

如您所见,您的版本有效,因为您传递的是特定字符,而不是类型。如果您希望代码有效,则可能需要创建一个新对象并将其传递给:

case class Me extends Player { val piece: Piece = new X }

编辑:正如OP在下面的评论中指出的那样,使用X()也有效,因为X是一个案例类,它得到一个隐式的apply()方法:

case class Me extends Player { val piece: Piece = X() }

答案 1 :(得分:2)

不推荐不带参数的案例类。请改用case class X()case class Me()。这样,您必须使用X调用创建X()类的对象,如其他答案中所述。

或者您可以使用case object s:

case object X extends Piece { val piece: Char = 'X' }.

实际上,如果你在这里使用case对象,你的代码将开始工作:

case class Me extends Player { val piece: Piece = X }  // Works fine

但这取决于您的要求。您可能需要X的多个实例;那么案例对象不适合你。

答案 2 :(得分:1)

当您撰写case class X时,您还要创建一个object X个伴侣,其成员apply可让您说X()。在使用Scala之后,这一切都很明显。

X.type是对象X的单例类型。它与“分配类型”无关,正如其他答案所说的那样。

当您将X作为值时,它表示该对象。它是一个术语(即值),而不是一个类型。

要创建新的X,每个人都会写X(),这正是X.apply(),而不是new X()。决不?是的,几乎没有。

请注意,paramless案例类很久以后就已弃用。

答案 3 :(得分:0)

您要将类型X分配给变量piece,而不是X的实例。