Scala泛型类中使用广义类型约束传递this实例的问题
解决Scala泛型类中类型约束下的
this类型匹配问题 你的问题核心在于:虽然T =:= Int的证据证明了T与Int是同一类型,但Scala编译器不会自动将Value[T]实例转换为Value[Int]——因为Value是不变类型构造器,Value[T]和Value[Int]在类型层面不会被编译器自动等价,即使T和Int是同一类型。
下面提供几种可行的解决方案:
方案1:利用类型证据安全强制转换
既然有T =:= Int的保证,我们可以安全地使用asInstanceOf将this转换为Value[Int]:
case class Sum(x: Value[Int], y: Value[Int]) { def apply(): Int = x.v + y.v } case class Value[T](v: T) { def plus(y: Value[Int])(using ev: T =:= Int): Int = Sum(this.asInstanceOf[Value[Int]], y)() }
方案2:构造新的Value[Int]实例(无强制转换)
通过ev将this.v转换为Int,再构造新的Value[Int],完全避免强制转换:
case class Sum(x: Value[Int], y: Value[Int]) { def apply(): Int = x.v + y.v } case class Value[T](v: T) { def plus(y: Value[Int])(using ev: T =:= Int): Int = Sum(Value(ev(v)), y)() }
方案3:定义隐式转换(适合多处复用场景)
如果需要在多个方法中进行类似转换,可以定义一个隐式转换,借助T =:= Int的证据自动将Value[T]转为Value[Int]:
case class Sum(x: Value[Int], y: Value[Int]) { def apply(): Int = x.v + y.v } case class Value[T](v: T) { def plus(y: Value[Int])(using ev: T =:= Int): Int = { import Value._ Sum(this, y)() } } object Value { implicit def toValueInt[T](value: Value[T])(using ev: T =:= Int): Value[Int] = Value(ev(value.v)) }
这三种方案都能让编译器正确识别this的类型为Value[Int],你可以根据代码场景选择最适合的方式。
内容的提问来源于stack exchange,提问作者obeattie
相关产品推荐
相关产品推荐

