Os daré un ejemplo para establecer un contexto aquí, así que tengo dos interfaces cada heredan la misma interfaz de los padres y que definen su propia implementación del método abstracto de la interfaz de los padres.
interface A
{
Set a();
}
interface B extends A
{
@Override
default Set a()
{
return null;
}
}
interface C extends A
{
@Override
default Set a()
{
return null;
}
}
En una interfaz llamada D
, la aplicación crea una clase interna anónima que luego tiene que llamar a los súper tipos ( B
e C
) a()
aplicación.
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();
}
};
}
}
El problema es que las expresiones D.this.B.super.a()
y D.this.C.super.a()
no se compilan con éxito, por lo que lo está para arriba?
Gracias por la forma de sus esfuerzos.
Java que permite a las implementaciones de interfaz de acceso específicos con la sintaxis:
InterfaceName.super.method()
Sin embargo, dentro de la clase anónima para obtener la instancia adjuntando a D.this
. No está permitido combinar estas sintaxis para obtener primero la instancia que encierra, entonces sus implementaciones súper interfaz.
La solución a este problema es mover la declaración de totalSize
fuera de la clase anónima para que pueda acceder a las implementaciones de interfaz súper. La clase anónima todavía será capaz de hacer referencia a la variable local totalSize
porque es final
. (Todavía sería capaz de acceder a él si fuera efectivamente final - no final
. Pero nunca reasignado)
final int totalSize = B.super.a().size() + C.super.a().size();
return new HashSet()
{
// Anonymous class implementation here.
// You can refer to totalSize.
};
Es posible que haya omitido los genéricos por razones de brevedad, pero en caso de que no, tendrá que incluir los parámetros de tipo de Set
y HashSet
.