我知道我的问题很愚蠢,但是脑海里有些不清楚。我创建了一个具有默认方法的接口,我们将其命名为Dumb()。我想做的是在此方法中的某处使用this.argument,但这没有用。我知道一个接口不能有实例,但是该接口是由一个类实现的,我们将其命名为A。A通过调用我的Dumb()方法(a.Dumb()在main方法中有一个名为a的实例。 )。我的问题是,如果我调用我的方法(毕竟是继承的),为什么不能拥有这个?这不是通过我调用方法对对象的引用吗?而且我也知道接口类型的变量可以引用实现该接口的类的任何对象。
我对这个问题含糊其辞,但明确的解释确实有帮助。预先感谢!
答案 0 :(得分:0)
我这样解释您的情况:
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
有一个argument
字段,所以为什么会出现此错误:
Foo.java:4: error: cannot find symbol
return this.argument;
^
symbol: variable argument
1 error
这是因为Java要求接口本身是有效的。即使当前正在实现的所有类都碰巧具有相同名称的字段,它们也不能引用未声明的字段。
这不同于JavaScript,在JavaScript中引用是在运行时解析的;而不同于C ++,C ++中可以使用模板来解析每次使用的引用。
在Java中,您可以改为声明Foo
的所有实例都必须通过添加实现类可以提供的(可能是非默认的)方法来获取您感兴趣的参数的方法:< / p>
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());
}
}