Voici mon code:

class MyExample {

    public static <T,R> R myMethod(T x,R y){
        R z= x+y;// error occurs here
        
        return z;
    }

    public static void main(String args[])
    {
        Integer val = 10;
        String str="Hello World!";
        System.out.println(val+str);// this prints the expected result
        System.out.println(myMethod(10," Hello World!"));
    }

}

Ce code donne une erreur:

mauvais opérande pour l'opérateur binaire +

Quand je concat val et str avec +, cela fonctionne bien dans le bloc principal, mais pas dans myMethod.

Je ne comprends pas pourquoi ça arrive.

-1
vishnu 2 sept. 2020 à 19:52

2 réponses

Meilleure réponse

Comme beaucoup de gens le soulignent déjà, Java n'autorise pas la surcharge d'opérateurs, vous êtes donc obligé d'utiliser la méthode générique où + est défini. T et R sont effacés avec un objet, ce qui signifie qu'ils sont traités comme un objet car les seuls points communs entre T et R sont les propriétés disponibles dans l'objet, rappelez-vous T et R pour le compilateur pourrait être n'importe quel type arbitraire.

Le code ci-dessous n'est pas quelque chose que je suggérerai d'utiliser, c'est plus un hack qu'autre chose mais il vous permettra de compiler, mais il est sujet à de nombreuses erreurs d'exécution considérez-vous comme averti

class MyExample {

    public static <T ,R > R myMethod(T x, R y){
        return (R) (x.toString() + y.toString());
    }
    public static void main(String args[])
    {
        Integer val = 10;
        String str="Hello World!";
        System.out.println(val+str);// this prints the expected result
        System.out.println(myMethod(10," Hello World!"));
        System.out.println(myMethod("Hello World!", 10));
    }
}

La façon dont cela fonctionne est d'utiliser l'un des 8 types où + est défini. Dans le cas ci-dessus, nous utilisons String car tout objet a une représentation sous forme de chaîne avec la méthode toString(), puis convertit le type en type de retour R

Maintenant, je veux juste être complètement clair, le code affiché ici n'est qu'un hack pour vous permettre de compiler, veuillez ne pas utiliser ce code pour un code important.

Donc, pour être honnête, je vous recommanderais plutôt de demander le comportement que vous essayez d'archiver et non la façon de corriger votre solution actuelle, car cela ne mènera qu'à un code extrêmement avancé et qui sait peut-être que vous avez besoin de quelque chose de plus simple.

1
Shulkmaster 2 sept. 2020 à 18:12

Java ne prend pas en charge la surcharge d'opérateurs. L'opérateur + est défini sur sept des huit types primitifs (char, byte, short, int, long, {{X6 }} et double), ainsi que sur String.

Les types T et R sont illimités, ils sont donc effacé avec Object. Puisque + n'est pas défini sur Object, le compilateur génère une erreur de compilation.

System.out.println(val + str); fonctionne parce que le côté droit (str) de l'expression est un String, donc le compilateur essaie de convertir le côté gauche (val) en un {{X4} }. Chaque classe (au moins implicitement ) hérite de Object, donc chaque classe a une méthode d'instance toString() que est utilisé pour convertir ses instances en String s.

4
Turing85 16 sept. 2020 à 21:21