Bonjour,

Je ne comprends pas pourquoi le compilateur Java n'assure pas la conversion suivante.

En déclarant format() avec <K,V> (ligne commentée), je comprends que l'information générique sur K et V ne soit pas disponible dans TextOutputFormat.class.
Par contre, avec la déclaration Class<? extends InputFormat<?,?>> (ligne non commentée), tout se passe comme si TextOutputFormat et TextOutputFormat<?,?> n'étaient pas covariants.

Pourriez-vous m'expliquer ?
Merci d'avance.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
A<Text,NullWritable> a = ...;
a.format(TextOutputFormat.class); // PROBLEME :  method is not applicable
a.format((Class<? extends InputFormat<Text,NullWritable>>) TextOutputFormat.class); // ok
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
Interface A<K,V> {
    /** A setter for attribute format */
    // public void format(Class<? extends InputFormat<K,V>> format);
    public void format(Class<? extends InputFormat<?,?>> format);
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
java.lang.Object
  extended by org.apache.hadoop.mapreduce.OutputFormat<K,V>
      extended by org.apache.hadoop.mapreduce.lib.output.FileOutputFormat<K,V>
          extended by org.apache.hadoop.mapreduce.lib.output.TextOutputFormat<K,V>