scala中图类中的推断类型参数错误

时间:2016-12-07 11:03:09

标签: scala

我尝试在scala中实现以下图表类:     案例类NodeT

case class Node[T](i:T)

class Graph[N<:Node[T], +T](someNodes:Set[N], val edges:Set[(N,N)]) {
  val nodes: Set[N] = someNodes ++ edges.map(_._1) ++ edges.map(_._2)

  def addVortex(node:N)=new Graph(someNodes, edges)//just use someNodes instead of nodes + node
}

但是有一个错误说

  

推断类型参数[N,Nothing]不符合类Graph   类型参数bounds [N&lt ;: Node [T],+ T]

为什么会这样?

2 个答案:

答案 0 :(得分:2)

我将澄清@ chengpohi的回答

您的代码中存在两个问题。

小问题:由于note构造函数中未提及类型null,因此应直接指定它:

<ControlTemplate>
    <Grid>
        <Border CornerRadius="5 5 0 0" BorderThickness="1" >
            <TextBlock Text="{Binding}"/>
            <Border.Style>
                <Style TargetType="Border">
                    <Setter Property="BorderBrush" Value="Black"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding}" Value="{x:Null}">
                            <Setter Property="BorderBrush" Value="Transparent"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>
    </Grid>
</ControlTemplate>

更大的问题:正如@chengpohi所提到的类型<ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> <Grid> <Border CornerRadius="5 5 0 0" BorderThickness="1" > <ContentPresenter/> <Border.Style> <Style TargetType="Border"> <Setter Property="BorderBrush" Value="Black"/> <Style.Triggers> <DataTrigger Binding="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}" Value="{x:Null}"> <Setter Property="BorderBrush" Value="Transparent"/> </DataTrigger> </Style.Triggers> </Style> </Border.Style> </Border> </Grid> </ControlTemplate> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Path=Name}"> <DataGridTextColumn.Header> <Border Background="Cyan"> <TextBlock Text="NAME" Margin="5"/> </Border> </DataGridTextColumn.Header> </DataGridTextColumn> </DataGrid.Columns> 中不能同时存在,而 <android.support.v7.widget.Toolbar android:id="@+id/MyToolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" /> 中的T不能同时存在。所以你应该纠正其中一个定义

Graph

def addVertex(node: N) = new Graph[N, T](someNodes + node, edges)

原因是:提及类型参数T,因为协变意味着,GraphNode的子类型,但这会产生矛盾,通过case class Node[+T](i: T) 是不是class Graph[N <: Node[T], T] 的子类型,而应该根据您的定义。

答案 1 :(得分:1)

如果您要在variant中启用T类型Graph[N<:Node[T], +T],则需要启用Node Tvariant

case class Node[+T](i:T)