关于Scala中的 polymorphic expression cannot be instantiated to expected 错误

本文介绍了Scala中Set的使用方法,包括不可变集合与可变集合的区别及创建方式,并通过实例展示了如何避免类型不匹配的错误。
如果只需要一个不可变的集合,可以这样子创建,无需 import 引入:
scala> val set = Set(1,2,3)
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

如果想用可变的Set,必须import引入它,或者用原路径:
scala> val s = collection.mutable.Set(1,2,3)
s: scala.collection.mutable.Set[Int] = Set(1, 2, 3)

否则,混搭,再使用.toSet什么的,容易出现如此错误:
[error] /home/zhm/sparkAprioriV1/src/main/scala/Sapriori.scala:43: polymorphic expression cannot be instantiated to expected 
type;
[error]  found   : [B >: Int]scala.collection.immutable.Set[B]
[error]  required: scala.collection.mutable.Set[Int]
[error]                     tmp += cdd -> supOrNot(line.toSet, cdd)
[error]                                                 ^
[error] one error found

就是开头规定的是"import scala.collection.mutable.Set",中间定义的函数supOrNot 的第一个参数形式是 trans:Set[Int];此时,如果line<-trans(即调用函数supOrNot时输入的第一个参数)使用了.toSet;而toSet对应的是不可变集合。所以: 要求的参数是mutable的,但是输入的参数是immutable的 ,所以出现此类错误。

scala> List(1,2,3,1,2,3).toSet
res0: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

一般的参数类型不符合提示是mismatch之类的,这种错误较少见,记一下。

参考:12345
### Scala 构造函数实例化时类型不匹配的原因分析 在 Scala 中,当遇到 `constructor cannot be instantiated to expected type` 的错误提示时,通常是因为实际传递给构造函数的参数类型与预期类型的定义不符。以下是对此问题的具体解析: #### 错误原因 1. **Tuple 类型与 Map 类型的区别** - 在引用中提到创建了一个二元组实例:`val tp = new Tuple2[String,Int]("zhangsan",20000)`[^1]。这表明该对象是一个 `(String, Int)` 类型的元组。 - 如果目标是将此元组作为输入传入某个方法或构造函数,则需要确认接收方是否期望的是一个 `Map` 而不是 `Tuple`。因为虽然两者都可以表示键值对关系,但在 Scala 中它们属于完全不同的数据结构。 2. **部分应用函数(Partial Function)的作用域限制** - 部分应用函数允许我们定义只处理某些特定模式的情况下的行为[^3]。然而,在尝试将其用于更广泛场景之前必须小心确保所有可能情况都被覆盖到;否则可能会引发类似的编译期异常。 3. **Case Class 自动生成成员变量的影响** - 当使用 `case class` 定义新类时,默认会自动生成伴生对象以及适用的方法来简化操作过程[^2]。但如果手动指定了主次构造器或者修改默认实现方式的话,则需格外注意保持一致性以免造成混淆。 #### 解决方案建议 为了修正上述提及的问题,可以从以下几个方面入手调整代码逻辑: - 明确区分所需的数据结构形式究竟是简单的 key-value pair 还是要构建完整的映射表; ```scala // 正确做法一:如果只需要简单key-value pair可以用tuple即可满足需求 val personInfo: (String, Int) = ("lisi", 8000) // 或者转换成map后再继续后续流程 val salaryRecords: Map[String, Int] = Map(personInfo._1 -> personInfo._2) ``` - 对于涉及复杂业务规则判断的部分应用函数表达式应尽可能详尽列举各种可能性从而减少遗漏风险; ```scala object MessageHandler extends PartialFunction[AnyRef, Unit] { def apply(v1: Any): Unit = v1 match { case (name: String, actorInstance: Actor) => actorInstance ! GetIPRequest(name) act() case unexpectedMessage => System.err.println(s"Unexpected message received:$unexpectedMessage") act() } override def isDefinedAt(x: Any): Boolean = x.isInstanceOf[(String,Actor)] || true /*兜底*/ } ``` - 另外还需仔细审查是否存在因引入额外库文件而导致命名冲突等情况发生干扰正常运行机制的现象存在。 最后提醒一下开发者们平时养成良好习惯比如多利用IDE内置功能辅助排查潜在隐患提前预防此类低级失误再次上演!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值