gpt4 book ai didi

Scala 特征函数 : return instance of derived type

转载 作者:行者123 更新时间:2023-12-04 13:49:54 24 4
gpt4 key购买 nike

我有一本看起来像这样的特质书

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" );

我需要得到 Seq[Fiction]当我调用 getAllFiction 的实例上,比如说 fiction1 .我知道一种方法是做 .map( _.asInstanceOf[ Fiction ] ) .但是,有没有办法完全避免这种情况?

实际上,我意识到错误较少的方法是能够为 Fiction 定义一个伴随对象。扩展 Book这样我就可以调用 getAll在那个对象上(而不是在一个实例上做),但是,在那种情况下,我不确定如何将返回序列中的单个元素转换为 Fiction 的实例类,因为 Fiction类将不再派生自 Book .
我应该有两个不同的名称 Book特质?一个是这些对象的父类(super class),另一个是这些类的父类(super class)?

编辑:@Travis Brown 的回复解决了我最初的问题。如果有人对如何使用伴随对象而不是类实例来处理这个问题有意见,那也太好了!

最佳答案

这或多或少是 F-bounded polymorphism 的经典用例。 ,它允许您在父类(super class)型的方法中引用特定的子类型:

trait Book[B <: Book[B]] {
val sqlTableName;
def getAll: Seq[B] = { magicSQLFn( $"SELECT * FROM $sqlTableName" ) }
}

class Fiction extends Book[Fiction] { val sqlTableName = "fiction" }
class NonFiction extends Book[NonFiction] { val sqlTableName = "nonfiction" )

(这假设您的 magicSQLFn 将返回具有适当静态类型的东西,但毕竟它很神奇。)

F 有界多态性 has its detractors ,并且有一些问题需要注意,但它在 Scala 和 Java 中都是相当广泛使用的模式。

关于Scala 特征函数 : return instance of derived type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26630125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com