我想摆脱对一个generic(asInstanceOf[A]
)的运行时强制转换而不进行隐式转换.
当我有一个相当干净的数据模型,包含具有共同特征的案例类并希望在其上实现通用算法时,就会发生这种情况.作为一个例子,生成的算法应该采用一个类的类A
,它是一个子类,trait T
并且应该返回A
具有一些更新字段的具体类的副本.
当我可以简单地将一个abstract copy
-method 添加到基本特征并在所有子类中实现它时,这很容易实现.然而,这可能会使用某些算法仅需要的方法来污染模型,有时不可能,因为模型可能不受我的控制.
下面是一个演示问题的简化示例和使用运行时强制转换的解决方案.
请不要挂断细节.
假设有一个特征和一些我不能改变的案例类:
trait Share {
def absolute: Int
}
case class CommonShare(
issuedOn: String,
absolute: Int,
percentOfCompany: Float)
extends Share
case class PreferredShare(
issuedOn: String,
absolute: Int,
percentOfCompany: Float)
extends Share
Run Code Online (Sandbox Code Playgroud)
这是一种percentOfCompany
在股票总数发生变化时重新计算当前流量的简单方法,并更新案例类中的字段
def recalculateShare[A <: Share](share: A, currentTotalShares: Int): A = {
def copyOfShareWith(newPercentage: Float) = {
share match {
case common: CommonShare => common.copy(percentOfCompany = newPercentage)
case preferred: PreferredShare => preferred.copy(percentOfCompany …
Run Code Online (Sandbox Code Playgroud)