Scala:在编码时为函数参数提供类型信息

Scala:在编码时为函数参数提供类型信息,scala,types,Scala,Types,以下是我遇到的问题的简化版本: case class HEdge[N,E](n:N, e:E) case class ANode[N,E](head:N ,out:List[HEdge[N,E]]) object ANode{ def apply[N,E](head:N ,out:HEdge[N,E]*):ANode[N,E] = ANode(head,out.toList) } 当我想将其用于简单类型时,它会按预期工作: val x = ANode[String,String]("aaa

以下是我遇到的问题的简化版本:

case class HEdge[N,E](n:N, e:E)
case class ANode[N,E](head:N ,out:List[HEdge[N,E]])
object ANode{
  def apply[N,E](head:N ,out:HEdge[N,E]*):ANode[N,E] = ANode(head,out.toList)
}
当我想将其用于简单类型时,它会按预期工作:

val x = ANode[String,String]("aaa", HEdge("bb","cc"))
我还使用另一种更复杂的类型进行了测试:

case class Foo[N](e:N => Boolean)
case class Bar[E](e:E => Boolean)
当我为
Foo
Bar
中的函数完全指定类型参数时,它会起作用:

val y1 = ANode[Foo[String], Bar[String]](Foo[String](x => x == ""), HEdge(Foo[String](x => x == ""), Bar[String](z => z == "")))
但当我把它留给编译器来查找类型时,它就不起作用了:

val y = ANode[Foo[String], Bar[String]](Foo(x => x == ""), HEdge(Foo(x => x == ""), Bar(z => z == "")))

如何强制编译器正常工作?

case类阳极[N,E](head:N,out:List[HEdge[N,E]])
定义了自己的
应用
,这会导致重载和歧义。这将汇编:

case class HEdge[N,E](n:N, e:E)
class ANode[N,E](head:N ,out:List[HEdge[N,E]])
object ANode{
  def apply[N,E](head:N ,out:HEdge[N,E]*):ANode[N,E] = new ANode(head,out.toList)
}
case class Foo[N](e:N => Boolean)
case class Bar[E](e:E => Boolean)
val y1 = ANode[Foo[String], Bar[String]](Foo(x => x == ""), HEdge(Foo(x => x == ""), Bar(z => z == "")))

case类阳极[N,E](head:N,out:List[HEdge[N,E]])
定义自己的
apply
,您重载它会导致歧义。这将汇编:

case class HEdge[N,E](n:N, e:E)
class ANode[N,E](head:N ,out:List[HEdge[N,E]])
object ANode{
  def apply[N,E](head:N ,out:HEdge[N,E]*):ANode[N,E] = new ANode(head,out.toList)
}
case class Foo[N](e:N => Boolean)
case class Bar[E](e:E => Boolean)
val y1 = ANode[Foo[String], Bar[String]](Foo(x => x == ""), HEdge(Foo(x => x == ""), Bar(z => z == "")))

有没有办法把它作为一个
案例类
?我需要它成为我的模式匹配和其他东西的case类必须使用提供的
apply
方法,它与您的实现没有太大的不同。或者,如果您需要varargs而不是
列表
,请将您的
应用
重命名为其他对象,并显式使用它。是否有任何方法将其保留为
案例类
?我需要它成为我的模式匹配和其他东西的case类必须使用提供的
apply
方法,它与您的实现没有太大的不同。或者,如果需要varargs而不是
List
,请将
apply
重命名为其他名称,并显式使用它。