有人会帮我理解为什么这不起作用? Scala版本2.10
colorMap.put(ColorEnum.Red, "Foo")
创建一个Map,它接受Color作为键,String接受值
error: type mismatch
found: ColorEnum.Red.type
required: ColorEnum.Color
使用ColorEnum作为键将项目放在Map上
Dim dict As Scripting.Dictionary
Function TreeRoot(ID As Long) As Long
If dict Is Nothing Then
Set dict = New Scripting.Dictionary ' Requires Microsoft Scripting Runtime
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("tblTree", dbOpenForwardOnly, dbReadOnly)
Do Until rs.EOF
dict.Add (rs!ID), (rs!ParentID)
rs.MoveNext
Loop
Set rs = Nothing
End If
TreeRoot = ID
Do While dict(TreeRoot) <> 0 ' Note: short version for dict.item(TreeRoot)
TreeRoot = dict(TreeRoot)
Loop
End Function
这会引发异常
Function ChildHasParent(ID As Long, ParentID As Long) As Boolean
If dict Is Nothing Then
Set dict = New Scripting.Dictionary ' Requires Microsoft Scripting Runtime
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("tblTree", dbOpenForwardOnly, dbReadOnly)
Do Until rs.EOF
dict.Add (rs!ID), (rs!ParentID)
rs.MoveNext
Loop
Set rs = Nothing
End If
ChildHasParent = False
Do While dict(ID) <> 0 ' Note: short version for dict.item(TreeRoot)
ID = dict(ID)
If ID = ParentID Then
ChildHasParent = True
Exit Do
End If
Loop
End Function
我必须在理解这应该如何运作的情况下遗漏一些东西。
由于
答案 0 :(得分:2)
<强>要点:强>
从Scala 2.11(以及Scala的所有前面版本回到2.8)开始,Map
的关键是A
中的Map[A, +B]
类型。并且Map在指定密钥时不允许协方差;即注意A之前没有加号(+)。
这是一个特定的StackOverflow答案,它解决了详细信息: https://stackoverflow.com/a/678637/501113
<强>详细信息:强>
您的特征Color
是您定义Map
的类型。然后定义Color
特征的三个后代。然后,您试图将Color
特征的后代(而不是特征本身的实例)插入Map
。 Map
的类型定义仅允许Color
特征的直接实例,而不是后代(通过extends
或with
定义)。
将后代密钥插入.asInstanceOf[Color]
时,可以使用Map
,以符合密钥的Map
类型要求。但是,使用这种方法警告被认为是一种不受欢迎的代码味道。
<强>加成:强>
您似乎正在尝试定义自己的强类型枚举。请查看this answer to a related question regarding defining enumerations in Scala。