Scala泛型类调用方法报错:printID不是ItemInterface的成员
问题解决:Scala泛型类调用trait方法报错
你代码里的问题出在泛型类的定义上:class ItemsContainer[ItemInterface]里的ItemInterface是泛型参数的占位符名称,不是你之前定义的那个trait。Scala会把它当成一个没有任何约束的全新类型,自然找不到printID方法,所以报错“value printID is not a member of ItemInterface”。
修正方法很简单,给泛型参数加上上界约束,指定它必须是ItemInterface的子类型,这样Scala就能确认这个类型拥有trait ItemInterface的所有方法。同时建议把泛型参数名换成更清晰的名字(比如T),避免和trait名称混淆:
trait ItemInterface: def printID(): Unit class Item(id: String) extends ItemInterface: def printID(): Unit = println(id) // 泛型参数T被约束为ItemInterface的子类型 class ItemsContainer[T <: ItemInterface]: private var objects: List[T] = Nil def add(item: T): Unit = objects = objects :+ item def printAllId(): Unit = objects.foreach(_.printID()) // 可以简化成下划线的写法,更简洁
如果非要保留泛型参数名ItemInterface也可以,但可读性很差,不推荐:
class ItemsContainer[ItemInterface <: ItemInterface]: // 后续代码和上面一致
内容的提问来源于stack exchange,提问作者Tobias To
相关产品推荐
相关产品推荐

