构造一个基于传递参数的对象。但参数不是字符串。我找到了如何用字符串Scala instantiate objects from String classname来做的解决方案,但我相信它可以做得更好。让我们假设下面的类:
sealed trait Figure
object Figure {
final case class Circle(radius: Double) extends Figure
final case class Square(a: Double) extends Figure
}
让我们定义一个函数(这没有意义),它基于以下条件接受一个参数:我可以调用适当的构造函数:
val construct123: Figure => Either[String, Figure] = (figure: Figure) => Right(figure.apply(1.23))
我想援引
construct123(Circle)
//or
construct123(Square)
这可能吗?
1条答案
按热度按时间li9yvcax1#
最简单的方法是稍微修改
construct123
的签名或者
construct123
可以写成高阶函数Difference between method and function in Scala
construct123(Circle)
和construct123(Square)
中的Circle
和Square
不是事例类Circle
和Square
,而是它们的伴随对象Class companion object vs. case class itself
所以实际上你想把一个对象转换成它的同伴类的示例,你可以用macro来实现
或
测试(在不同的子项目中):
您可以隐藏类型类中的宏(使用白盒implicit macros定义)。下面的类型类
ToCompanion
类似于Get companion object of class by given generic type Scala(answer)中的HasCompanion
。Shapeless中的类型类Generic
(下面用于定义construct123
)也是宏生成的。一些类型类(普通,非宏生成)的介绍:1个2个3个4个5个6个7个89个由于所有的类现在在编译时都是已知的,所以最好使用编译时反射(上面的宏),但原则上也可以使用runtime reflection
或
或者你可以使用结构类型aka duck typing(也就是运行时反射)