簡體   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