Question

Dans le test suivant, une contrainte TesterClass place sur la relation entre ses deux paramètres de type. La méthode func2 () semble briser cette contrainte, et je pense à provoquer une part d'erreur de compilation de frappe (sur la définition de func2, ou chaque fois que la classe est utilisée avec un second paramètre autre que String), mais il ne fait pas!

De plus, si je func2 d'appel et enregistrer le résultat dans une variable appropriée typée, la compilation échoue (le type de cette variable). Mais faire la même chose et enregistrer dans un type plus général (comme Object) réussit, malgré le fait que le type de retour de la fonction doit avoir le même type dans les deux cas (avant la mise sous pression).

Qu'est-ce qui se passe ici?

Merci!

public class TestGenerics {
    public static class ParamedType<T> {}


    public class TesterClass<A extends ParamedType<B>, B> {
        public TesterClass<A, B> func() {
            return new TesterClass<A, B>();
        }

        public TesterClass<A, String> func2() {
            return new TesterClass<A, String>();
        }
    }

    public Object test() {
        // How can I use these type parameters? Doesn't .func2 now have an invalid return type?
        TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>();

        //TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile
        Object res = testClass.func2(); // Compiles
        return res;
    }
}

EDIT : Ce ne pas dans la compilation javac (versions présentés ci-dessous). J'utilise Eclipse, et en essayant de trouver ce qui est le compilateur qui est en fait en cours d'exécution. Mettra à jour. Peut-être un bug JDT (compilateur Eclipse).

J'ai ouvert un rapport de bogue pour le JDT Eclipse: https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503

Était-ce utile?

La solution

La réponse est simple: il ne compile pas, au moins sous javac 1.7:

Test.java:10: type parameter A is not within its bound
    public TesterClass<A, String> func2() {
                       ^
  where A,B are type-variables:
    A extends ParamedType<B> declared in class Test.TesterClass
    B extends Object declared in class Test.TesterClass
Test.java:11: type parameter A is not within its bound
        return new TesterClass<A, String>();
                               ^
  where A,B are type-variables:
    A extends ParamedType<B> declared in class Test.TesterClass
    B extends Object declared in class Test.TesterClass
2 errors

Vous n'avez pas dit ce que vous compilez sous -. Je suppose que votre compilateur Java a un bogue

Autres conseils

Apparemment, cela est un bug dans Eclipse JDT.core. J'ai ouvert un rapport de bogue à https://bugs.eclipse.org/bugs /show_bug.cgi?id=333503

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top