Java 匿名内部 class 调用封闭类型超类型方法
Java anonymous inner class calling enclosing type super types method
我给你一个例子,在这里设置一些上下文,所以我有两个接口,每个接口都继承了相同的父接口,并定义了自己对父接口抽象方法的实现。
interface A
{
Set a();
}
interface B extends A
{
@Override
default Set a()
{
return null;
}
}
interface C extends A
{
@Override
default Set a()
{
return null;
}
}
在一个名为 D
的接口中,该实现创建了一个匿名内部 class,然后需要调用超类型(B
和 C
)a()
实施。
interface D extends B, C
{
@Override
default Set a()
{
return new HashSet()
{
{
final int totalSize = D.this.B.super.a().size() + D.this.C.super.a().size();
}
};
}
}
问题是表达式 D.this.B.super.a()
和 D.this.C.super.a()
没有编译成功,怎么回事?
顺便谢谢你的努力。
Java 允许您使用以下语法访问特定接口实现:
InterfaceName.super.method()
但是,在匿名class 内部获取带有D.this
的封闭实例。不允许组合这些语法首先获取封闭实例,然后获取其超接口实现。
这里的解决方案是将 totalSize
的声明移到匿名 class 之外,以便您可以访问超级接口实现。匿名 class 仍然可以引用局部变量 totalSize
,因为它是 final
。 (如果它实际上是最终的,它仍然可以访问它——不是 final
但从未重新分配。)
final int totalSize = B.super.a().size() + C.super.a().size();
return new HashSet()
{
// Anonymous class implementation here.
// You can refer to totalSize.
};
您可能为了简洁而省略了泛型,但如果您没有,您将需要包含 Set
和 HashSet
的类型参数。
我给你一个例子,在这里设置一些上下文,所以我有两个接口,每个接口都继承了相同的父接口,并定义了自己对父接口抽象方法的实现。
interface A
{
Set a();
}
interface B extends A
{
@Override
default Set a()
{
return null;
}
}
interface C extends A
{
@Override
default Set a()
{
return null;
}
}
在一个名为 D
的接口中,该实现创建了一个匿名内部 class,然后需要调用超类型(B
和 C
)a()
实施。
interface D extends B, C
{
@Override
default Set a()
{
return new HashSet()
{
{
final int totalSize = D.this.B.super.a().size() + D.this.C.super.a().size();
}
};
}
}
问题是表达式 D.this.B.super.a()
和 D.this.C.super.a()
没有编译成功,怎么回事?
顺便谢谢你的努力。
Java 允许您使用以下语法访问特定接口实现:
InterfaceName.super.method()
但是,在匿名class 内部获取带有D.this
的封闭实例。不允许组合这些语法首先获取封闭实例,然后获取其超接口实现。
这里的解决方案是将 totalSize
的声明移到匿名 class 之外,以便您可以访问超级接口实现。匿名 class 仍然可以引用局部变量 totalSize
,因为它是 final
。 (如果它实际上是最终的,它仍然可以访问它——不是 final
但从未重新分配。)
final int totalSize = B.super.a().size() + C.super.a().size();
return new HashSet()
{
// Anonymous class implementation here.
// You can refer to totalSize.
};
您可能为了简洁而省略了泛型,但如果您没有,您将需要包含 Set
和 HashSet
的类型参数。