Scala密封特性作为地图上的关键引发不匹配错误

时间:2016-06-28 11:13:22

标签: scala

有人会帮我理解为什么这不起作用? 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

我必须在理解这应该如何运作的情况下遗漏一些东西。

由于

1 个答案:

答案 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特征的后代(而不是特征本身的实例)插入MapMap的类型定义仅允许Color特征的直接实例,而不是后代(通过extendswith定义)。

将后代密钥插入.asInstanceOf[Color]时,可以使用Map,以符合密钥的Map类型要求。但是,使用这种方法警告被认为是一种不受欢迎的代码味道。

<强>加成:
您似乎正在尝试定义自己的强类型枚举。请查看this answer to a related question regarding defining enumerations in Scala