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

标签 java java-8

TL;TD 在 Java 8 中,接口(interface)默认方法是否可以访问实例变量?

例如:

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

public class Bar implements Foo {
   int baz;
   ...
}

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

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

最佳答案

接口(interface)不会“看到”其实现的实例字段。这不是特定于接口(interface)的,任何父类(super class)型都不知道其子类型的特定字段(或任何与此相关的成员类型)。

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

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

    int getBaz();
}

并让具体类实现 getter:

public class Bar implements Foo {
   int baz;
   public int getBaz() {return this.baz;}
}

关于java - 在Java 8中,接口(interface)默认方法可以访问实例变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54578089/

相关文章:

java - 如何将表与该表的实体类中 View 的一列连接起来

java - 四舍五入双值

Java Swing ;如何使程序在屏幕的最右侧启动?

java - 在静态上下文中存储对实例方法的引用

java - 认可的 dir 机制不起作用?

java - android.permission.WRITE_SECURE_SETTINGS 错误

java - 在 Camera2 api 上使用 captureBurst 时 JPEG 回调超时

Java 8 : generic type inference fails on method reference?

java - JPA LazyInitializationException - 无法初始化代理

Java 8 增强了带有索引/范围的 for 循环