javac: types incompatibles requis: classname trouvé: classname
Le code suivant se compile dans JDK6. Échoue dans JDK7 avec une erreur de compilation.
java: incompatible types
required: com.jdk7.IExporter<O>
found: com.jdk7.IExporter<java.lang.Object>
Le compilateur est 1.7.0_10, d'Oracle.
$ javac -version
javac 1.7.0_10
Code
package com.jdk7;
public class GenericIn7 {
public <O> IExporter<O> getExporter(Class<O> objType) {
final IExporter<O> localExporter =
determineExporter(getPersistentInterface(objType));
return null;
}
private <O> IExporter<O> determineExporter(Class<O> persistentInterface) {
return null;
}
protected <O, I extends O> Class<O> getPersistentInterface(Class<I> clazz) {
return null;
}
}
class IExporter<T> {
}
[Par souci d'exhaustivité, le remplacement de generic par IExporter et d'autres modifications le font compiler. ]
1
1 answers
Il semble que l'inférence de type ne fonctionne tout simplement pas comme prévu sur cette ligne:
final IExporter<O> localExporter =
determineExporter(getPersistentInterface(objType));
Je pense que le problème est ce que O
est résolu à en getPersistentInterface()
. Il est appelé comme si vous aviez appelé this.<Object, O>getPersistentInterface(...)
. Si vous êtes explicite:
final IExporter<O> localExporter =
determineExporter(this.<O, O>getPersistentInterface(objType));
Cela fonctionne bien.
3
Author: Mark Peters, 2013-01-22 05:09:44