在 Scala 中覆盖不同类型的特征函数

Overriding trait functions with different types in Scala

我有以下内容:

类 "Hashtag" 和 "Keyword" 每个扩展特征 "Data"

类 "HashtagManager" 和 "KeywordManager" 每个扩展特征 "DataManager"

它们具有相同的功能,只是它们管理的类型 (hashtags/keywords) 不同。

HashtagManager 有一个 List[Hashtag],KeywordManager 有一个 List[Keyword]

我希望 DataManager 实现函数 findInList(X),其中 X 是标签或关键字。

如何在 DataManager 中以通用方式编写 整个 函数实现,同时在 HashtagManager/KeywordManager 中覆盖 X 的 TYPE 使其可变?

此外,DataManager 怎么会有一个 List[X] 的通用 var,在每个子类管理器中覆盖这个 var 时,它分别变成 List[Hashtag]、List[Keyword]?

我觉得你的情况是这样的

trait Data
class Hashtag extends Data
class Keyword extends Data

trait DataManager {
  // need a List[Data]
  // need a findInList(x: Data)
}
class HashtagManager extends DataManager
class KeywordManager extends DataManager

如果您希望列表开始时为空,您可以...

trait DataManager[T <: Data] {
   var l: List[T] = List.empty[T]
   def findInList(x: T) = ??? // not sure what you want to find
}
class HashtagManager extends DataManager[Hashtag]
class KeywordManager extends DataManager[Keyword]

如果您想在 class 实例化时初始化您的列表 l,您可以 ...

trait DataManager[T <: Data] {
   var l: List[T]
   def findInList(x: T) = ??? // not sure what you want to find
}
class HashtagManager(var l: List[Hashtag]) extends DataManager[Hashtag]
class KeywordManager(var l: List[Keyword]) extends DataManager[Keyword]

关键部分是 [T <: Data],它允许您使用类型 T(继承自 Data

来定义 methods/vars/vals