Scala 3带类型边界的泛型类辅助构造器编译错误及解决
Scala 3带类型边界的构造器重载匹配错误解析
问题复现
以下代码在Scala 3.2.1中编译失败:
import scala.collection.mutable class Whole[T <: Comparable[T]](val name: T): val parts: mutable.Map[T, Part[T]] = mutable.LinkedHashMap() class Part[T <: Comparable[T]](val whole: Whole[T], val name: T): // 辅助构造器 def this(whole: Whole[T], part: Part[T]) = this(whole, part.name) // 此处报错 // 其他逻辑
编译错误提示:
None of the overloaded alternatives of constructor Part in class Part with types [T <: Comparable[T]] (whole: Whole[T], part: Part[T]): Part[T] [T <: Comparable[T]] (whole: Whole[T], name: T): Part[T] match arguments ((whole : Whole[T]), (part.name : T)) this(whole, part.name)
移除类型边界<: Comparable[T]后代码可正常编译。
错误原因
这是Scala 3在处理带类型边界的类构造器重载时的类型推断歧义问题:
- 类
Part的类型参数T带有<: Comparable[T]的上界约束 - 辅助构造器中,
part.name的类型为T,逻辑上必然满足T <: Comparable[T],但编译器在解析构造器调用时,没有正确将类的类型边界约束关联到构造器参数的类型检查中,导致无法匹配主构造器的参数签名。
解决方法
方法1:显式指定构造器的类型参数
在调用主构造器时明确指定类型参数[T],帮助编译器确认类型约束:import scala.collection.mutable class Whole[T <: Comparable[T]](val name: T): val parts: mutable.Map[T, Part[T]] = mutable.LinkedHashMap() class Part[T <: Comparable[T]](val whole: Whole[T], val name: T): def this(whole: Whole[T], part: Part[T]) = this[T](whole, part.name) // 显式指定类型参数 // 其他逻辑方法2:使用工厂方法替代辅助构造器
避免构造器重载带来的类型推断问题,改用伴生对象的工厂方法:import scala.collection.mutable class Whole[T <: Comparable[T]](val name: T): val parts: mutable.Map[T, Part[T]] = mutable.LinkedHashMap() class Part[T <: Comparable[T]](val whole: Whole[T], val name: T) object Part: def apply[T <: Comparable[T]](whole: Whole[T], part: Part[T]): Part[T] = new Part(whole, part.name)方法3:给构造器添加
@targetName注解
通过注解给不同的构造器指定唯一名称,消除编译器的重载解析歧义:import scala.collection.mutable import scala.annotation.targetName class Whole[T <: Comparable[T]](val name: T): val parts: mutable.Map[T, Part[T]] = mutable.LinkedHashMap() class Part[T <: Comparable[T]](val whole: Whole[T], val name: T): @targetName("fromPart") def this(whole: Whole[T], part: Part[T]) = this(whole, part.name) // 其他逻辑
内容的提问来源于stack exchange,提问作者grepmonkey
相关产品推荐
相关产品推荐

