J'ai encore des problèmes avec certains cas de coin dans le système générique java.enums et méthodes génériques en Java
J'ai cette méthode (je suis seulement intéressé par la signature):
interface Extractor<RETURN_TYPE> {
public <U extends Enum<U>> RETURN_TYPE extractEnum(final Class<U> enumType);
}
(pensez à une interface dont les implémentations extraits parfois un EnumSet parfois une mise en œuvre d'extraire un JComboBox etc.)
et je veux l'appeler avec une classe obtenue lors de l'exécution, donc je l'appelle simplement la façon suivante:
public static <RETURN_TYPE> RETURN_TYPE extractField(final Extractor<RETURN_TYPE> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(/* error here*/type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
et je reçois un message d'erreur étrange: types incompatibles trouvée: java.lang.Object nécessaire: type_retour
l'emplacement du message si juste après la braket d'ouverture de l'appel, avant le « t » de type.
si je l'appelle d'un contexte non générique, il fonctionne:
Integer extractField(final Extractor<Integer> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
Quelqu'un at-il une explication et une solution à ce problème s'il vous plaît?
Voici un dossier complet pour les personnes qui veulent jouer avec elle:
public class Blah {
interface Extractor<RETURN_TYPE> {
public <U extends Enum<U>> RETURN_TYPE extractEnum(final Class<U> enumType);
}
public static <RETURN_TYPE> RETURN_TYPE extractField(final Extractor<RETURN_TYPE> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(/* error here*/type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
public static Integer extractField(final Extractor<Integer> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
}
merci à l'avance,
Nico
Votre question me rappelle un vieux dessin animé Peanuts. Linus: "Je pense que ma langue ne fonctionne pas! J'essaie de dire brlalalala mais il sort toujours brzazazaa!" Lucy: "Je pense que toute ta tête ne fonctionne pas." –
Je dois dire ... sans un exemple de jouet compilable (qui n'a pas d'abstraction dénuée de sens), il est très difficile de comprendre la question. –
Jonathan> tout le point est qu'il ne compile pas. Je vais ajouter une classe complète. – nraynaud