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

内斯特·米利亚耶夫(Nestor Milyaev):

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

例如:

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

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

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

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

ernest_k:

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

在这种情况下,您的解决方案是在接口中声明一个抽象的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;}
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

实例方法是否需要访问Java中的实例变量?

Java 8可以即时实现接口以供方法参考吗?

本地类可以访问Java 8中的非最终变量

Java 8默认方法接口重写对象等于方法

如何使用Java 8的默认方法在接口中使用EntityManager实例?

我们可以在Java中创建接口的实例吗?

何时使用:Java 8+接口默认方法与抽象方法

接口可以在Java中扩展多个接口吗?

Java中的父类和子类可以具有相同的实例变量吗?

在Java中可以“反射地”访问方法的源代码吗?

我可以在Java中将方法存储在变量中吗?

在Eclipse中从Java访问Scala实例变量

在Java中实现接口的子类可以有自己的方法吗?

接口中默认方法的Java 7替代(仅在Java 8中)

随着Java8接口中默认方法的出现,现在可以在Java中使用类适配器

在Java 8之前的版本中使用SPI中的默认接口方法

Java 9中接口方法的默认访问修饰符?

JAVA FX:我可以从任何控制器访问main中实例化的对象吗?

JIT编译器可以内联Java 8默认接口方法吗?

在Spring Java 8中可以从功能接口访问服务类方法吗?

为什么JCF接口中的许多方法未在Java 8中设为默认方法?

如何在Java接口默认方法中模拟静态变量?

在Java中访问方法的变量

我可以重载Java中的接口方法吗?

Java 8接口中的默认方法

我可以从Java中的类实例中删除方法吗?

实例变量可以由方法使用,局部变量也可以在方法内部以与Java中的实例变量相同的名称声明

Java 8:我们可以使用 map 在流中创建实例方法 ref 吗?

在 Android Java/Kotlin 中,实现接口是否可以直接访问嵌套类的局部变量