JavaDOM/AST-为什么MethodInvocation是一个表达式?
在JavaDOM/AST()中,为什么初始值设定项包含块,为什么方法调用是表达式而不是语句 我是说,根据密码JavaDOM/AST-为什么MethodInvocation是一个表达式?,java,dom,abstract-syntax-tree,eclipse-jdt,Java,Dom,Abstract Syntax Tree,Eclipse Jdt,在JavaDOM/AST()中,为什么初始值设定项包含块,为什么方法调用是表达式而不是语句 我是说,根据密码 int a = Integer.parseInt("1"); ASTView插件只向我显示初始值设定项>方法调用 有没有一个初始值设定项真的有块元素 再者,如果我有这样的方法 public void thisMethod(){ System.out.println(); } MethodInvocation被包装到ExpressionStatement中。但是为什么Metho
int a = Integer.parseInt("1");
ASTView插件只向我显示初始值设定项>方法调用有没有一个初始值设定项真的有块元素 再者,如果我有这样的方法
public void thisMethod(){
System.out.println();
}
MethodInvocation被包装到ExpressionStatement中。但是为什么MethodInvocation不是一个语句呢?只是一个简单的系统。out.println()是一个有效的“语句”。JavaDOM/AST意义上的表达式缺乏代表自身的能力
也许我没有完全理解表达式和语句之间的分离。AST树的设计是为了反映编程语言的语法规则 语法上,初始值设定项由一个块组成,该块前面有一个可选的
static
修饰符。因此,它是最自然的实现,拥有一个由块和修饰符(继承自BodyDeclaration
)组成的初始值设定项
类。所以我不明白你为什么质疑它
初始值设定项示例:
class Foo {
static {
System.out.println("static initializer");
System.out.println("class Foo now initialized");
}
{
System.out.println("instance initializer");
System.out.println("an instance of Foo has been created");
}
}
表达式和语句是两种不同的语法结构。有些地方只允许使用表达式或语句。但也有类似方法调用的结构,它们是表达式语句,这意味着可以同时完成角色、表达式和语句。它们可以单独调用以产生副作用,但也可以在需要值的地方调用
但由于Java不允许多重继承,您无法创建一个AST类ExpressionStatement
继承Expression
和语句
。因此,您需要一个类似于EclipseAST的解决方案,其中ExpressionStatement
继承其中一个并包装另一个。决定继承哪一个和包装哪一个很容易:您可以创建一个语句实现(子类)它将删除它已包装的表达式的结果,但不能创建表达式实现,该实现为通过接口不提供结果的语句提供结果。这种实现的另一种选择是使用接口。这个“RTFM”对我毫无帮助,对不起。而且,它没有回答第一个问题。你理解表达和陈述的概念吗?如果不是,就没有必要询问特定实现的推理。关于您的第一个问题,“为什么初始值设定项包含块”-我不明白,如果不是块,初始化器还应该包含什么?您的链接有助于清除?不,没有。表达式不能代表它自己,语句可以代表它自己。但是MethodInvocation可以代表它自己!“如果不是块”:单个表达式,但方法调用可以返回一个值,因此在允许表达式的地方允许该值。方法调用适合表达式和语句。这就是表达语句的要点,是的,链接解释了这一点。但是你要读的不仅仅是主播的几句话。谢谢你的回答,我现在明白为什么MI是一个表达式了。但是一个块看起来像{…}。你见过像int a={…}这样的初始化吗?对于阵列,有一个ArrayInitializer。Afaik没有包含多个语句的初始值设定项(这是块的函数:将多个语句分组)