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

时间:2018-08-03 14:44:55

标签: scala class polymorphism traits

我有以下内容:

“ Hashtag”和“关键字” EACH类扩展了特征“数据”

“ HashtagManager”和“ KeywordManager”类的每个扩展特征“ DataManager”

它们具有相同的功能,但它们管理的类型(标签/关键字)不同。

HashtagManager具有一个列表[Hashtag],而KeywordManager具有一个列表[Keyword]

我希望DataManager实现功能findInList(X),其中X是Hashtag或Keyword。

当在HashtagManager / KeywordManager中重写X的类型时,如何在DataManager中以通用方式编写 entire 函数实现?

此外,DataManager如何拥有通用的List [X]变量,在每个子类管理器中重写此变量后,它分别变为List [Hashtag],List [Keyword]?

1 个答案:

答案 0 :(得分:2)

我认为你的情况就像

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]

如果您想在类实例化时初始化列表,则可以...

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)定义方法/变量/值。