关于scala:在运行时创建具有相同内部内容的对象
Create object at runtime which have the same internal contents
我正在执行创建具有相同内部内容的对象的重复任务,因此我想创建一个通用方法来帮助我实现这一目标。
内部对象如下
|
1
|
case class Data(value: Int)
|
我有一个基本特征如下
|
1
|
trait Base
|
有几个类扩展了这个特性
|
1
2 3 |
case class A(data: Data) extends Base
case class B(data: Data) extends Base case class C(data: Data) extends Base |
我试图编写的用于创建对象的通用方法
|
1
2 3 |
def getObject[T <: Base](data: Data, t: T) = {
T(data) } |
但是,在尝试这样做时,我收到一个编译时错误,提示
|
1
|
Cannot resolve symbol T
|
你能告诉我我在这个方法实现中缺少什么吗?
注意:- 这是我在代码中尝试做的一个非常简单的实现。
由于类型擦除,您不能使用泛型类型来创建对象的新实例。
您可以使用 ClassTag 在运行时捕获 T 类:
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
case class Data(value: Int)
trait Base case class A(data: Data) extends Base def getObject[T <: Base](data: Data)(implicit ct: ClassTag[T]): T = val a: A = getObject[A](Data(1)) |
正如 cchantep 所注意到的,它有一个缺点,如果您的案例类没有带有单个参数 Data 的构造函数,则此函数将在运行时失败。
相关讨论
- 或者可以避免不安全的运行时反射的工厂类型类
- @Krzysztof At??asik 感谢您的回答。赞成它,但更喜欢类型类实现,因为它是类型安全的
考虑编译时安全的类型类解决方案
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
final case class Data(value: Int)
final case class A(data: Data) final case class B(data: Data) final case class C(data: Data) trait BaseFactory[T] { object BaseFactory { val data = Data(42) |