[见下面的代码片段] 我读到我的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 }
答案 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
的实例。