Scala动态类型
printall的使用应与main方法中所述的相同。但在编译过程中,我得到了以下错误:Scala动态类型,scala,generics,types,type-parameter,Scala,Generics,Types,Type Parameter,printall的使用应与main方法中所述的相同。但在编译过程中,我得到了以下错误: object BugFixProject { def main (args: Array[String]) { val repoWithEntities = Seq( (ARepo, Seq(A("", ""), A("", ""))), (BRepo, Seq(B("", ""), B("", ""))) ) printall(repoWithEnti
object BugFixProject {
def main (args: Array[String]) {
val repoWithEntities = Seq(
(ARepo, Seq(A("", ""), A("", ""))),
(BRepo, Seq(B("", ""), B("", "")))
)
printall(repoWithEntities)
}
def printall[Entity](pairs: Seq[(BaseRepo[Entity], Seq[Entity])]) : Seq[String] = {
pairs.map { t =>
val repo = t._1
val entities = t._2
entities.map(repo.toString(_))
}.flatten
}
}
case class A(foo: String, bar: String){}
case class B(foo: String, bar: String){}
trait BaseRepo[X] {
def toString(x: X) : String = x.toString
}
object BRepo extends BaseRepo[B] {}
object ARepo extends BaseRepo[A] {}
实体只能是1个特定类型 尝试以非常通用的方式进行函数调用,如下所示
def printall[Entity]
通过这种方式,您可以使用
BRepo
或ARepo
对象调用printall
方法。如果您知道方法中的内容,则不需要类型参数Entity
。现在还不清楚你想在这里做什么,你有没有试着重写一下你的代码让它更清晰?嗯。我不知道如何澄清。。。我希望printall
可以通过repoWithEntities
调用,但不知道方法签名的外观printall
应该可以调用类型为Seq[(BaseRepo[Entity],Seq[Entity])]
的值,其中的“Entity”表示元组必须包含具有相同类型序列的BaseRepo。如示例所示,repoWithEntities可以具有包含不同类型的不同Repo的元组。在对printall
的任何单个调用中,是的,Entity
必须是特定的某种类型。是否可以更改符号以使每次调用不限于一种类型?但这样就可以拥有一对(ARepo,Seq(B(“,”)
这在printall
中是不允许的。这可能是您的解决方案不可编译的原因。
Error:(12, 18) type mismatch;
found : Seq[(BaseRepo[_ >: B with A <: Product with Serializable], Seq[Product with Serializable])]
required: Seq[(BaseRepo[Entity], Seq[Entity])]
printall(repoWithEntities)
^
def printall[Entity]
def printall(pairs: Seq[(BaseRepo[_], Seq[_])]) : Seq[String] = {