默认方法中的 this 关键字
This keyword in a default method
我知道我的问题很愚蠢,但我脑子里有些不清楚。我创建了一个具有默认方法的接口,我们将其命名为 Dumb()。我想做的是在此方法中的某处使用 this.argument ,但这没有用。我知道一个接口不能有实例,但是该接口是由 class 实现的,我们将其命名为 A。A 在 main 方法中有一个实例,名为 a,通过我调用我的 Dumb() 方法( a.Dumb()).我的问题是,如果我调用我的方法(毕竟谁继承了),为什么我不能拥有这个?这不是通过我调用方法引用的对象吗?而且我还知道接口类型的变量可以引用实现该接口的 classes 中的任何对象。
我对这个问题有一个模糊的想法,但清楚的解释会很有帮助。提前致谢!
我是这样解读你的情况的:
interface Foo {
default int Dumb() {
return 2*this.argument;
}
}
class A implements Foo {
int argument = 42;
public static void main(String[] args) {
A a = new A();
System.out.println(a.Dumb());
}
}
你的问题是
A
has an argument
field, so why do I get this error:
Foo.java:4: error: cannot find symbol
return this.argument;
^
symbol: variable argument
1 error
这是因为Java要求接口本身有效。他们不能引用未声明的字段,即使所有当前实施的 类 恰好有一个同名的字段。
这与 JavaScript 不同,后者的引用在运行时解析,也不同于 C++,后者每次使用都可以使用模板来解析引用。
在 Java 中,您改为声明 Foo
的所有实例都必须通过添加(可能是 non-default)来获取您感兴趣的参数实现类可以提供的方法:
interface Foo {
default int Dumb() {
return 2*getArgument();
}
int getArgument();
}
class A implements Foo {
int argument = 42;
public int getArgument() {
return argument;
}
public static void main(String[] args) {
A a = new A();
System.out.println(a.Dumb());
}
}
我知道我的问题很愚蠢,但我脑子里有些不清楚。我创建了一个具有默认方法的接口,我们将其命名为 Dumb()。我想做的是在此方法中的某处使用 this.argument ,但这没有用。我知道一个接口不能有实例,但是该接口是由 class 实现的,我们将其命名为 A。A 在 main 方法中有一个实例,名为 a,通过我调用我的 Dumb() 方法( a.Dumb()).我的问题是,如果我调用我的方法(毕竟谁继承了),为什么我不能拥有这个?这不是通过我调用方法引用的对象吗?而且我还知道接口类型的变量可以引用实现该接口的 classes 中的任何对象。
我对这个问题有一个模糊的想法,但清楚的解释会很有帮助。提前致谢!
我是这样解读你的情况的:
interface Foo {
default int Dumb() {
return 2*this.argument;
}
}
class A implements Foo {
int argument = 42;
public static void main(String[] args) {
A a = new A();
System.out.println(a.Dumb());
}
}
你的问题是
A
has anargument
field, so why do I get this error:
Foo.java:4: error: cannot find symbol
return this.argument;
^
symbol: variable argument
1 error
这是因为Java要求接口本身有效。他们不能引用未声明的字段,即使所有当前实施的 类 恰好有一个同名的字段。
这与 JavaScript 不同,后者的引用在运行时解析,也不同于 C++,后者每次使用都可以使用模板来解析引用。
在 Java 中,您改为声明 Foo
的所有实例都必须通过添加(可能是 non-default)来获取您感兴趣的参数实现类可以提供的方法:
interface Foo {
default int Dumb() {
return 2*getArgument();
}
int getArgument();
}
class A implements Foo {
int argument = 42;
public int getArgument() {
return argument;
}
public static void main(String[] args) {
A a = new A();
System.out.println(a.Dumb());
}
}