Tu mets les instanceof dont la méthode a besoin pour faire son boulot.
Dans le 2nd cas, tu sais que tu bosses avec un truc implémentant obligatoirement l'interface Data. Mais ce "truc" peut implémenter d'autres interfaces. Tu as le droit d'interroger ce $data pour lui demander si c'est un Age ($data instanceof Age) et d'agir en conséquence.
Dans le 1er cas, pareil, sauf que tu bosses avec un $data encore plus large (c'est "un truc quelconque").
Tu confonds la signature de la méthode, qui dit "Je n'accepte ce message que si tel paramètre implémente telle interface", sa documentation qui dit voici ce que je fais, et son algorithme interne qui est voilà comment je le fais. Cet algorithme est caché au monde extérieur (et c'est bien). Qu'il se base sur le fait que tel paramètre est de tel type, que tel paramètre est de tel autre type et renvoie tel autre résultat, de l'extérieur, on s'en fiche.
Ma boîte est en fait tellement noir que l'extérieur ne sait même pas qu'elle fait une discrimination en fonction des interfaces de ses paramètres. Et dans le 1er cas, elle connait encore moins de choses sur l'extérieur (puisqu'elle doit interroger cet extérieur à coup d'instanceof).
Dans le 2nd cas, tu sais que tu bosses avec un truc implémentant obligatoirement l'interface Data. Mais ce "truc" peut implémenter d'autres interfaces. Tu as le droit d'interroger ce $data pour lui demander si c'est un Age ($data instanceof Age) et d'agir en conséquence.
Dans le 1er cas, pareil, sauf que tu bosses avec un $data encore plus large (c'est "un truc quelconque").
Tu confonds la signature de la méthode, qui dit "Je n'accepte ce message que si tel paramètre implémente telle interface", sa documentation qui dit voici ce que je fais, et son algorithme interne qui est voilà comment je le fais. Cet algorithme est caché au monde extérieur (et c'est bien). Qu'il se base sur le fait que tel paramètre est de tel type, que tel paramètre est de tel autre type et renvoie tel autre résultat, de l'extérieur, on s'en fiche.
Ma boîte est en fait tellement noir que l'extérieur ne sait même pas qu'elle fait une discrimination en fonction des interfaces de ses paramètres. Et dans le 1er cas, elle connait encore moins de choses sur l'extérieur (puisqu'elle doit interroger cet extérieur à coup d'instanceof).