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
重命名为其他名称,并显式使用它。