繁体   English   中英

在 Scala 中,设置转换为 Map 错误。无法证明 (String, Class[?0]) forSome { type ?0 } <:< (T, U)

[英]In Scala,Set convert to Map error.Cannot prove that (String, Class[?0]) forSome { type ?0 } <:< (T, U)

此代码工作正常

def init = {
    var jobPackageClassSet:Set[Class[_]] = ClassUtil.getClassSetFromPackge("com.test.job");
    val jobAnnotion = classOf[JobAnnotation];
    val a = jobPackageClassSet.asScala.filter { cls =>
      cls.isAnnotationPresent(jobAnnotion)
    }.map(cls => cls.getAnnotation(jobAnnotion).jobName -> cls.getName).toMap
  }  

但是当我更改代码(cls.getAnnotation(jobAnnotion).jobName -> cls)如下时,它会导致错误

 def init = {
    var jobPackageClassSet = ClassUtil.getClassSetFromPackge("com.test.job");
    val jobAnnotion = classOf[JobAnnotation];
    val a = jobPackageClassSet.asScala.filter { cls =>
      cls.isAnnotationPresent(jobAnnotion)
    }.map(cls => cls.getAnnotation(jobAnnotion).jobName -> cls).toMap
  }    

错误:

无法证明 (String, Class[?0]) forSome { type ?0 } (T, U)。 方法 toMap 没有足够的参数

从这个问题: 无法证明 Unit <:< (T, U)将我的代码更改为此,仍然是错误。

def init = {
    var jobPackageClassSet = ClassUtil.getClassSetFromPackge("com.test.job");
    val jobAnnotion = classOf[JobAnnotation];
    val a = jobPackageClassSet.asScala.filter { cls =>
      cls.isAnnotationPresent(jobAnnotion)
    }.map(cls => cls.getAnnotation(jobAnnotion).jobName -> cls).collect{case t@(k:String,v:Class[_]=>t)}.toMap
  }

有没有人更早得到这个?

问题是toMap只能在对的序列(或集合)上调用,但由于某种原因,您有一系列存在类型,每个类型都是一对。 您想要(String, Class[?0] forSome { type ?0 })而不是(String, Class[?0]) forSome { type ?0 } ,尽管我不清楚为什么您当前的代码出错类型( ClassUtil.getClassSetFromPackge的返回类型是ClassUtil.getClassSetFromPackge )?

我期望.map(cls => cls.getAnnotation(jobAnnotion).jobName -> (cls: Class[_])).map { case cls: Class[_] => cls.getAnnotation(jobAnnotion).jobName -> cls }应该可以解决这个问题。

我知道这是个老问题,但我为现在到达这里的人发帖:)

我今天对其他类型也有同样的错误:

val seq: Seq[(String, com.company.complicatedUnionClass)] = //.....
val mapped = seq.toMap

Cannot prove that (String, _ >: com.company.complicatedUnionClass) forSome { type _$8 >: com.company.complicatedUnionClass }  <:< (T, U)

在 toMap 中显式添加 [T,U] 参数解决了编译错误

val seq: Seq[(String, com.company.complicatedUnionClass)] = //.....
val mapped = seq.toMap[String, com.company.complicatedUnionClass]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM