1
votes

Une classe non générique peut-elle implémenter une interface générique?

J'ai lu "Java. A Beginner's Guide" de Herbert Schildt. Dans la section sur les interfaces génériques sur une page, l'auteur écrit (c'est moi qui souligne):

Toute classe qui implémente une interface générique doit elle-même être générique .

Et sur la page suivante (c'est moi qui souligne):

En général , si une classe implémente une interface générique, alors cette classe doit également être générique , au moins dans la mesure où elle prend un paramètre de type qui est passé à l'interface.

Y a-t-il donc des situations spécifiques où une classe non générique peut implémenter une interface générique en Java? Ou toutes ces classes sont génériques en ce qu'elles «héritent» de cette généralité de l'interface générique?

UPD: J'aurais dû lire la section plus loin. L'auteur poursuit:

Bien sûr, si une classe implémente un type spécifique d'interface générique, comme illustré ici: La classe MyClass implémente le confinement { alors la classe d'implémentation n'a pas besoin d'être générique.

Voici, je crois, l'essentiel de toutes les réponses à mon message.


0 commentaires

3 Réponses :


4
votes

Il est possible de créer une classe non générique qui implémente une interface générique, à condition que les paramètres de type soient fournis.

Un exemple relativement simpliste:

public class LocalDateParser implements Function<String, LocalDate> {
    public LocalDate apply (String s) {
        return LocalDate.parse(s);
    }
}

Bien sûr, vous ne pouvez affecter une instance de cette classe qu'à Function , et pas à une autre Function .


2 commentaires

Ah, donc quand un type spécifique d'interface générique est implémenté, la classe d'implémentation n'a pas besoin d'être générique - ok. Mais si un paramètre de type est utilisé dans la déclaration d'interface, la classe implémentant l'interface doit également l'indiquer, non?


Chaque fois qu'une classe ou une interface est fournie avec des paramètres de type, ceux-ci doivent être fournis. Sinon, cela mène juste à la douleur. Question pertinente: Qu'est-ce qu'un type brut et pourquoi ne devrions-nous pas l'utiliser?



2
votes

Je pense que l'auteur a tout à fait tort dans les deux déclarations. Une classe générique est une classe qui accepte un paramètre de type générique. Et vous pouvez créer une classe qui n'accepte aucun paramètre de type générique qui implémente une interface générique:

public class CaseInsensitiveComparator implements Comparator<String> {

    @Override
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
}

En fait, cette classe existe déjà dans le JDK, bien qu'elle soit implémentée différemment. Veuillez consulter String.CASE_INSENSITIVE_ORDER code> pour plus de détails.


2 commentaires

Je crois que c'est ce que voulait dire Joe C. J'aurais dû lire la section plus loin. L'auteur poursuit en déclarant: "Bien sûr, si une classe implémente un type spécifique d'interface générique, [...] alors la classe d'implémentation n'a pas besoin d'être générique." Donc je crois que c'est une question de sémantique.


@JohnAllison " doit être lui-même générique" n'est pas seulement une mauvaise sémantique. C'est faux! Il existe plus de cas de classes non génériques implémentant une interface générique que de classes génériques implémentant des interfaces génériques utilisant les mêmes arguments.



2
votes

Le guide que vous lisez est faux.

Il existe de nombreux exemples de classes non génériques implémentant des interfaces génériques.

Le plus courant est Comparable . Le javadoc Java 8 répertorie 152 classes d'implémentation, dont peu transmettent un argument de type générique à l'interface, puisqu'elles sont toutes supposées se spécifier comme argument de Comparable , par exemple

public final class Instant implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable
public final class Integer extends Number implements Comparable<Integer>
public final class String implements Serializable, Comparable<String>, CharSequence


0 commentaires