[英]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.