Java позволяет вам получить доступ к конкретным реализациям интерфейса с помощью синтаксиса:
InterfaceName.super.method()
Однако внутри анонимного класса можно получить включающий экземпляр с D.this
.Нельзя объединять эти синтаксисы, чтобы сначала получить включающий экземпляр, а затем его реализации суперинтерфейса.
Решение здесь состоит в том, чтобы переместить объявление totalSize
за пределы анонимного класса, чтобы вы могли получить доступ креализации суперинтерфейса.Анонимный класс по-прежнему сможет ссылаться на локальную переменную 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
.