Scala抽象类定义foldRight方法报错:未找到类型T
解决Scala代码中
not found: type T的错误 嘿,这问题我熟!你遇到的not found: type T报错,根源很简单——你的抽象类ListT没有声明泛型参数T,编译器根本不知道这个T是啥类型,自然会报错。
咱们一步步来修正:
第一步:给抽象类添加泛型参数
首先要给ListT加上[T]泛型标记,这样整个类的成员都能识别这个类型参数:
abstract class ListT[T] { // 这里的T现在就有明确定义了 }
第二步:调整foldRight的实现(两种可选方式)
方式一:符合Scala惯用法的实例方法
通常Scala里的集合方法都是实例方法,不需要额外传入list参数,直接让方法作用在当前List实例上:
abstract class ListT[T] { def foldRight[U](z: U)(op: (T, U) => U): U = this match { case NilT => z case ConsT(x, xs) => op(x, xs.foldRight(z)(op)) } } // 必须定义ListT的具体实现:空列表和非空列表 case object NilT extends ListT[Nothing] case class ConsT[T](head: T, tail: ListT[T]) extends ListT[T]
这里用this match来匹配当前实例的类型,空列表返回初始值z,非空列表就递归调用tail的foldRight,完全符合面向对象的设计逻辑。
方式二:保留传入list参数的版本(如果需要)
如果你坚持要通过传入list参数来实现,那至少要确保list的类型是咱们自己的ListT[T](别和标准库的List混淆):
abstract class ListT[T] { def foldRight[U](z : U)(list: ListT[T], op: (T, U) => U): U = list match { case NilT => z case ConsT(x, xs) => op(x, foldRight(z)(xs, op)) } } case object NilT extends ListT[Nothing] case class ConsT[T](head: T, tail: ListT[T]) extends ListT[T]
关键说明
- 为什么要改类名后缀?因为Scala标准库已经有
Nil和List了,咱们自己实现的话换个名字(比如NilT、ConsT、ListT)可以避免命名冲突,减少编译器混淆。 - 泛型参数
[T]是整个类的核心,没有它,方法里的T就成了无定义的类型,这就是你报错的核心原因。
这样修正后,编译器就能识别T类型了,foldRight方法也能正常工作啦!
内容的提问来源于stack exchange,提问作者PhysicsMath
相关产品推荐
相关产品推荐

