假设我有两个类,A
和B
:
class A
{
void method()
{
System.out.println("a.method");
}
}
class B extends A
{
@Override
void method()
{
System.out.println("b.method");
}
}
在将b
实例化为b
之后,我可以像b.method()
那样调用b
的方法。我还可以使b
的方法使用super.method()
调用a
的方法。但如果A
是一个接口会怎样:
interface A
{
default void method()
{
System.out.println("a.method");
}
}
class B implements A
{
@Override
void method()
{
System.out.println("b.method");
}
}
有什么方法可以让b
的方法调用a
的方法吗?
是的,你可以。使用
A.super.method();
JLS规定
如果表单为typename。超级。[TypeArguments]标识符
,则:
让t
是立即包含方法调用的类型声明。如果T
是类对象,则是编译时错误。
否则,typename
表示要搜索的接口i
。
在Java8中,我有如下内容: 例如,如果A解锁或提供了对一个资源(比如数据库)的访问,而B解锁了第二个资源(另一个数据库),我认为没有办法使代码解锁A,然后B通过使用函数接口强制执行这个契约,要求调用A和B。一层深的你可以做到,但N层深的看起来就不可能了。 我打算使用lambdas来避免进行昂贵的调用,但要对我的库的用户执行语义操作顺序。 这个问题与“在Java中显式调用默认方法”并不完全相同,
问题内容: 在Java 8中,我有类似以下内容: 有没有一种方法可以从ImplementsB调用默认的功能接口行为,而不必创建匿名内部类并调用该内部类? 这会有副作用(两次调用ImplementsA的方法),需要调用父级的实现,然后让子级的实现能够调用子级的默认实现,并在需要时进行一些专门化。如您所见,调用父级的实现非常简单,但是我看不到一种避免重写默认实现的方法,除非我在实现子接口的类上添加了间
Java8在接口上引入了默认方法,为collections接口的实现提供向下兼容,以避免遗留库上的MethodNotFound错误。 也就是说,具有Java7实现List的库不会实现stream()方法。如果Java8代码使用这个库,默认实现提供了一个后退。 我在实践中看到的是,许多开发人员过度使用这个特性,以类似scala特性的风格来模拟混合和多重继承。 我担心的一个问题是,这种编程风格模糊了接
假设我有这个接口A: “类型B不能是C的超级接口;超级接口必须是接口” 如果这个类的层次结构是有效的,那么任何人现在都可以了,还是我应该反过来做?
问题内容: 考虑以下情况, 在上面的例子中我得到以下输出这是 相当 期待。 我一直在阅读有关默认方法的信息, 尤其是 关于扩展包含默认方法的接口的信息 2 第二子弹:重新声明的默认方法,这使得它的抽象。 在上面的示例中,我有两个接口的默认方法具有相同的名称,并且当我实现这两个接口时,我只能实现对的引用。 我对此几乎没有疑问, 我怎样才能 到达 的方法 和 如果我不能比,为什么? 没有这种行为从本质
我试图使用以下代码理解Java接口中的默认方法,但我无法编译它: 编译器生成了以下输出: 我无法理解这些错误。我如何更正代码中的问题?