我有一个名为“Book”的特征,长这样:
当我在
实际上,我意识到更少错误的方法是能够为
编辑:@Travis Brown的回复解决了我的初始问题。 如果有人对如何使用伴生对象而不是类实例处理此问题有评论,那就太好了!
trait Book{
val sqlTableName;
def getAll: Seq[ Book ] = { magicSQLFn( $"SELECT * FROM $sqlTableName" ) }
}
我有两个派生类型:
class Fiction extends Book{ val sqlTableName = "fiction" }
class NonFiction extends Book{ val sqlTableName = "nonfiction" );
当我在
Fiction
的实例上调用getAll
时,我需要得到Seq[Fiction]
。 我知道的一种方法是执行.map( _.asInstanceOf[ Fiction ] )
。 但是,有没有一种方法可以避免这种情况?实际上,我意识到更少错误的方法是能够为
Fiction
定义一个扩展Book
的伴生对象,以便我可以在该对象上调用getAll
(而不是在实例上进行)。但是,在这种情况下,我不确定如何将返回序列中的单个元素转换为Fiction
类的实例,因为Fiction
类将不再派生自Book
。 我应该有两个不同命名的Book
traits吗? 一个是这些对象的超级,另一个是这些类的超级类?编辑:@Travis Brown的回复解决了我的初始问题。 如果有人对如何使用伴生对象而不是类实例处理此问题有评论,那就太好了!
Fiction
伴生对象上定义getAll
意味着Fiction
不能扩展Book
?这可能值得跟进一下。 - Travis Brown[B <: Book]
应该改为[B <: Book[B]]
。 - dips