我尝试在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]
为什么会这样?
答案 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
,因为协变意味着,Graph
是Node
的子类型,但这会产生矛盾,通过case class Node[+T](i: T)
是不是class Graph[N <: Node[T], T]
的子类型,而应该根据您的定义。
答案 1 :(得分:1)
如果您要在variant
中启用T
类型Graph[N<:Node[T], +T]
,则需要启用Node
T
为variant
。
case class Node[+T](i:T)