默认方法中的 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());
  }
}