Java Language Implémentation de plusieurs interfaces


Exemple

Parfois, vous souhaiterez peut-être avoir une expression lambda implémentant plusieurs interfaces. Ceci est surtout utile avec les interfaces de marqueurs (telles que java.io.Serializable ) car elles n’ajoutent pas de méthodes abstraites.

Par exemple, vous voulez créer un TreeSet avec un Comparator personnalisé, puis le sérialiser et l'envoyer sur le réseau. L'approche triviale:

TreeSet<Long> ts = new TreeSet<>((x, y) -> Long.compare(y, x));

ne fonctionne pas car le lambda pour le comparateur n'implémente pas Serializable . Vous pouvez résoudre ce problème en utilisant des types d'intersection et en spécifiant explicitement que ce lambda doit être sérialisable:

TreeSet<Long> ts = new TreeSet<>(
    (Comparator<Long> & Serializable) (x, y) -> Long.compare(y, x));

Si vous utilisez fréquemment des types d'intersection (par exemple, si vous utilisez un framework tel qu'Apache Spark où presque tout doit être sérialisable), vous pouvez créer des interfaces vides et les utiliser à la place dans votre code:

public interface SerializableComparator extends Comparator<Long>, Serializable {}

public class CustomTreeSet {
  public CustomTreeSet(SerializableComparator comparator) {}
}

De cette façon, vous êtes assuré que le comparateur passé sera sérialisable.