在Java 8中,接口默认方法可以访问实例变量吗?

Nes*_*aev -1 java java-8

TL; TD在Java 8中,有一种接口默认方法来访问实例变量的方法吗?

例如:

public interface Foo{
    default getBazModified(){
       return baz * 2; 
    }
}

public class Bar implements Foo {
   int baz;
   ...
}
Run Code Online (Sandbox Code Playgroud)

我知道这听起来像travisty但是有没有办法在Java 8中做类似的事情?

或者唯一的方法是有一个实现Foo的抽象类,它将声明实例变量baz并具有getBazModified()的默认实现?

ern*_*t_k 7

接口不会"看到"其实现的实例字段.这不是特定于接口,任何超类型都不会知道其子类型的特定字段(或任何成员类型).

在这种情况下,您的解决方案是在接口中声明一个抽象的getter方法,并使用它来读取子类的属性:

public interface Foo{
    default int getBazModified(){
       return this.getBaz() * 2; 
    }

    int getBaz();
}
Run Code Online (Sandbox Code Playgroud)

让具体类实现getter:

public class Bar implements Foo {
   int baz;
   public int getBaz() {return this.baz;}
}
Run Code Online (Sandbox Code Playgroud)

  • 而所有这一切,必须有一些为方法指定的返回类型(`int` here) (2认同)