![](/img/trans.png)
[英]Why does @RequestMapping annotation accept String parameter in java but not in scala?
[英]Scala: generate Java annotation with parameter using Scala macros
我有一個帶有一個參數的簡單Java注釋:
public @interface Annot {
String value();
}
我還有Java注釋,它將Annot數組作為參數:
public @interface Annotations {
Annot[] value();
}
我想使用Scala宏生成帶有參數“value”的Annot,如下所示:
object MyAnnotations {
def MyAnnotation: Annot = macro myAnnotationMacro
def myAnnotationMacro(c: whitebox.Context): c.Expr[Annot] = {
import c.universe._
c.Expr(q"""new Annot("value")""")
}
}
雖然這有效:
@Annotations(Array(
new Annot("value")
))
trait T
這不起作用:
@Annotations(Array(
MyAnnotations.MyAnnotation
)) // too many arguments for constructor Annot: ()Annot
trait T
為什么? 我怎樣才能生成Annot?
我擔心你不能用宏來做你想做的事。
Java注釋的類型檢查以非常奇怪的方式實現,與typechecker的其他部分明顯不同。 雖然其他所有內容都是從Tree
到Tree
,但Java注釋的參數是從Tree
到ClassfileAnnotArg
(后者不是樹)的類型。 你的宏擴展為一個Tree
,而ClassfileAnnotArg
期望ClassfileAnnotArg
,所以事情不起作用(錯誤信息是非常誤導的)。
我認為可以將typechecker更改為適用於您的情況,但這需要修補編譯器。 不知道如何從宏中做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.