Scala 3泛型方法类型参数无法正常工作问题排查
问题分析与解决方案
先看你原本可以正常运行的代码:
trait Transformer[A, B] { def transform(a: A): B } class TransformerImpl extends Transformer[Int, String] { override def transform(value: Int): String = { value.toString } }
你想把Trait简化为只带一个类型参数A(因为B的类型由A决定),但你的两种实现都踩了泛型作用范围的坑:
第一种实现的错误原因
你写的Transformer2里,transform方法定义了方法层面的泛型参数B,这意味着调用该方法的人可以指定任意B类型,你的实现类试图把B固定成String完全不成立——你写的transform[String]里的[String]不是指Scala的String类,而是一个名为String的泛型占位符,编译器会把它当成和实际String无关的未知类型,所以才会出现“Found: String, Required: String”的诡异报错(两个String根本不是一回事)。
第二种实现的错误原因
第二种实现里,你试图实现一个无泛型参数的transform方法,但父Trait里的transform是带方法泛型的,两者签名完全不匹配——父方法要求能返回任意B类型,而你只实现了返回Int的版本,编译器自然认为你没完成抽象方法的实现,所以报错要求把类改成抽象类。
正确实现方式
既然B的类型由A决定,应该把B定义为Trait的类型成员,而不是方法级泛型。这样每个实现类可以根据A来指定对应的B类型,Trait只需要一个A参数:
trait Transformer2[A] { // 定义类型成员B,由实现类指定具体类型 type B def transform(a: A): B } // Int转String的实现 class Transformer2Impl extends Transformer2[Int] { type B = String override def transform(value: Int): String = value.toString } // Int转Int的实现 class Transformer2IntToIntImpl extends Transformer2[Int] { type B = Int override def transform(value: Int): Int = value }
如果想让类型定义更简洁,Scala 2.13+还可以用type Lambda简化,但上面的基础写法已经完全满足你的需求。
内容的提问来源于stack exchange,提问作者Jimmy Isaac
相关产品推荐
相关产品推荐

