【发布时间】:2016-10-09 17:00:32
【问题描述】:
假设我在为梦想建模:
public interface Dream {
void start();
}
public class SimpleDream implements Dream {
// implementation here...
}
public class Inception implements Dream {
Dream inner;
// implementation here...
}
现在假设我有一个装饰类来实现这些梦想:
public class Decorator implements Dream {
Dream decorated;
public void start() {
// do something else
decorated.start();
}
}
我希望能够编写一个方法,该方法将采用任何 Dream 实例并用 Decorator 递归(字段)装饰它。我可以用反射写出这样的方法,但是在尝试装饰Dream子类型的字段时遇到了问题:
public class LucidDream implements Dream {
SimpleDream inner;
// implementation here...
}
我的通用方法将尝试设置一个新的Decorator,将SimpleDream 包装到LucidDream 的inner 字段中,这样做(使用Field.set)将引发异常(java.lang.IllegalArgumentException: Can not set final X field Y to Z)。
我尝试使用代理,但没有成功。
附言
我实际上使用的是 Scala,所以 (a) 请原谅我的 Java 代码,以及 (b) 如果这只能通过 Scala 以某种方式实现,我也想知道这一点。
【问题讨论】:
-
请原谅我问一个显而易见的问题:你不能将 LucidDream 更改为具有“Dream”类型的“内在”吗?即“类 LucidDream 实现 Dream{ Dream inninter;}
-
好吧,不幸的是,没有。
-
如果有人感兴趣,我的实际用例是通过 AST 调试日志记录(在评估树中每个表达式之前和之后进行调试)。
标签: java scala reflection