私は以下の質問があります。私たちのプロジェクトにはたくさんのコードがあり、Scalaでテストを実行します。そして、このようなフィールドを埋めるコードの多くは、そこにある:Scalaは、実際に呼び出し元が期待する戻り値の型から実際の型を推論できますか?
production.setProduct(new Product)
production.getProduct.setUuid("b1253a77-0585-291f-57a4-53319e897866")
production.setSubProduct(new SubProduct)
production.getSubProduct.setUuid("89a877fa-ddb3-3009-bb24-735ba9f7281c")
は最終的に、私は、これらすべてのフィールドは、実際にUUIDフィールドを持つ基本クラスのサブクラスであるため、このコードから疲れて育ったので、
production.setProduct(createUuid[Product]("b1253a77-0585-291f-57a4-53319e897866"))
production.setSubProduct(createUuid[SubProduct]("89a877fa-ddb3-3009-bb24-735ba9f7281c"))
:しばらく考えた後、私はこのような補助関数を書いた:今、私はこのような何かを書くことができますので、今
def createUuid[T <: GenericEntity](uuid: String)(implicit m : Manifest[T]) : T = {
val constructor = m.runtimeClass.getConstructors()(0)
val instance = constructor.newInstance().asInstanceOf[T]
instance.setUuid(uuid)
instance
}
を、私のコードは、2回短くなりましたそれは良いことだが、最後のビットは、この希望ので、私は何とか機能createUuidを実装することができれば、私は、疑問に思って:
// Is that really possible?
production.setProduct(createUuid("b1253a77-0585-291f-57a4-53319e897866"))
production.setSubProduct(createUuid("89a877fa-ddb3-3009-bb24-735ba9f7281c"))
缶Scalaのコンパイラの推測を、そのsetProductだけではなく、一般的なエンティティが、実際の製品のようなものを期待します(またはそのサブクラス)?あるいはこれをさらに短く実装する方法はありませんか?
私はGenericEntityのサブクラスである約30の型を持っていますが、このような暗黙のdefを書く必要がありますか?あるいは、私はそれを1回だけ行うことができますか? –