鉴于以下内容:
sealed trait ProdItem {
val name: String;
val price: BigDecimal;
}
final case class Foo( override val name: String = "Apple",
override val price: BigDecimal = 0.50) extends ProdItem
final case class Bar( override val name: String = "Orange",
override val price: BigDecimal = 0.35) extends ProdItem
val products = List( Foo, Bar, Foo, Bar)
// products: List[scala.runtime.AbstractFunction2[String,scala.math.BigDecimal,Product with Serializable with ProdItem]] = List(Foo, Bar, Foo, Bar)
我可以看到列表集合与Products混合,然后是Serializable。所以它不是一个简单的List [ProdItem]。你如何简单地遍历产品中的元素?
val fullPrice = product.map( x => some_conversion_function(x).price ).sum
换句话说,如何将元组简单地转回叶子类?
这是案例类继承是愚蠢的另一个例子吗?
答案 0 :(得分:3)
这很有效。
val products = List(new Foo, new Bar, new Foo, new Bar)
val fullPrice = products.map(_.price).sum // 1.70
请考虑以下事项。
val foo = Foo()
在此示例中,Foo
没有名称或价格,但foo
没有。
在实例化案例类时,您可以选择new Foo
或"工厂方法" Foo()
。
答案 1 :(得分:1)
扩展jwvh的回答:
Foo
中的 List( Foo, Bar, Foo, Bar)
是类Foo
的伴随对象,而不是此类的实例。您的products
是函数的集合(不是Product with Serializable with ProdItem
!),因为
案例类的伴随对象扩展AbstractFunctionN
,其中N
是构造函数参数的数量。
对于Foo
和Bar
,参数的数量和类型恰好相同(如果参数类型不同,您最终会得到更复杂的类型,如果数字不同,您最终可能只会使用Serializable
或AnyRef
)。
Product with Serializable with ProdItem
是结果函数的常见超类型。