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. ]

Author: Jayan, 2013-01-22

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