gpt4 book ai didi

scala - 从特征自动生成 Scala 类

转载 作者:行者123 更新时间:2023-12-01 08:32:43 25 4
gpt4 key购买 nike

我想创建一个生成特征实现的方法。例如:

trait Foo {
def a
def b(i:Int):String
}

object Processor {
def exec(instance: AnyRef, method: String, params: AnyRef*) = {
//whatever
}
}

class Bar {
def wrap[T] = {
// Here create a new instance of the implementing class, i.e. if T is Foo,
// generate a new FooImpl(this)
}
}

我想像这样动态生成 FooImpl 类:

class FooImpl(val wrapped:AnyRef) extends Foo {
def a = Processor.exec(wrapped, "a")
def b(i:Int) = Processor.exec(wrapped, "b", i)
}

手动实现每个特征不是我们想要的(很多样板文件)所以我希望能够在编译时生成 Impl 类。我正在考虑注释这些类并可能编写一个编译器插件,但也许有更简单的方法?任何指针将不胜感激。

最佳答案

java.lang.reflect.Proxy 可以做一些非常接近您想要的事情:

import java.lang.reflect.{InvocationHandler, Method, Proxy}

class Bar {
def wrap[T : ClassManifest] : T = {
val theClass = classManifest[T].erasure.asInstanceOf[Class[T]]
theClass.cast(
Proxy.newProxyInstance(
theClass.getClassLoader(),
Array(theClass),
new InvocationHandler {
def invoke(target: AnyRef, method: Method, params: Array[AnyRef])
= Processor.exec(this, method.getName, params: _*)
}))
}
}

这样,您就无需生成 FooImpl

一个限制是它只适用于没有实现方法的特征。更准确地说,如果一个方法在特征中实现,调用它仍然会路由到处理器,并忽略实现。

关于scala - 从特征自动生成 Scala 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11810414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com