有特点
trait Persisted {
def id: Long
}
Run Code Online (Sandbox Code Playgroud)
如何实现一个接受任何case类实例的方法并返回其特征混合的副本?
该方法的签名如下:
def toPersisted[T](instance: T, id: Long): T with Persisted
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用此方法创建特征实例
val inst = new Object with MyTrait
Run Code Online (Sandbox Code Playgroud)
这很好用,但我想把这个创作转移到生成器函数,即.
object Creator {
def create[T] : T = new Object with T
}
Run Code Online (Sandbox Code Playgroud)
我显然需要清单以某种方式修复类型擦除问题,但在此之前,我遇到了两个问题:
即使有一个隐含的清单,Scala仍然要求T是一个特征.如何添加限制来创建[T]以使T成为特征?
如果我选择使用Class.newInstance方法动态创建实例而不是使用"new",我如何在"new object with T"中指定"with"?是否可以在运行时动态创建新的具体mixin类型?
我正在努力实现以下目标:
class A {
def foo() { "foo" }
}
class B {
def bar() { "bar" }
}
A.mixin B
def a = new A()
a.foo() + a.bar()
Run Code Online (Sandbox Code Playgroud)
有一个显着的区别 - 我想在实例上做mixin:
a.mixin B
Run Code Online (Sandbox Code Playgroud)
但这会导致
groovy.lang.MissingMethodException: No signature of method: A.mixin() is applicable for argument types: (java.lang.Class) values: [class B]
Run Code Online (Sandbox Code Playgroud)
有没有办法像Groovy Mixins JSR中提出的那样工作?