【问题标题】:In Scala,Set convert to Map error.Cannot prove that (String, Class[?0]) forSome { type ?0 } <:< (T, U)在 Scala 中,设置转换为 Map 错误。无法证明 (String, Class[?0]) forSome { type ?0 } <:< (T, U)
【发布时间】:2020-07-29 00:39:43
【问题描述】:

这段代码运行正常

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 -&gt; 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 的足够参数

从这个问题:Cannot prove that 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
  }

有没有人早点得到这个?

【问题讨论】:

  • 请突出显示错误文本,以便人们快速轻松地了解。

标签: scala type-conversion


【解决方案1】:

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

我希望.map(cls =&gt; cls.getAnnotation(jobAnnotion).jobName -&gt; (cls: Class[_])).map { case cls: Class[_] =&gt; cls.getAnnotation(jobAnnotion).jobName -&gt; cls } 应该可以解决问题。

【讨论】:

    【解决方案2】:

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

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

    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]
    
    

    【讨论】:

      猜你喜欢
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      相关资源
      最近更新 更多