Scala带类型参数的case class报类型不匹配编译错误求助
编译失败原因
问题核心是removeFirst方法声明的泛型参数[T]和类ValueContainer定义的协变泛型参数[+T]重名,发生了泛型遮蔽:
- 类上定义的
T是和实例绑定的,代表当前容器存储的元素类型,容器内部container列表的元素类型就是这个类级别的T - 方法上额外声明的
[T]是属于方法自己的独立泛型参数,和类级别的T完全是两个不同的类型,所以编译器会提示类型不匹配,找到的是类级别的T,但方法需要的是自己声明的T。
修复方案
removeFirst操作是移除当前容器的首个元素,不需要引入新的泛型参数,直接使用类定义的T即可,只需要删掉方法上多余的[T]泛型声明就能正常编译:
final case class ValueContainer[+T](private val container: List[T]) { def addValue[A >: T] (value: A) : ValueContainer[A] = ValueContainer(value :: container) // 移除方法前多余的[T]泛型声明 def removeFirst: RemovalOperationResult[T] = RemovalOperationResult(container.headOption, ValueContainer(container.drop(1)) ) } final case class RemovalOperationResult[T](itemRemoved: Option[T], remainingValues: ValueContainer[T])
内容的提问来源于stack exchange,提问作者valterriann
相关产品推荐
相关产品推荐

