6
votes

Java soustrayez les valeurs génériques L'opérateur moins est indéfini

J'essaie de soustraire la valeur d'un tableau fourni (matrice 2D). Je voudrais faire en utilisant des génériques. Quelqu'un peut-il aider ce qui ne va pas avec mon code? Je veux dire, ai-je besoin d'étendre une classe? Je reçois l'erreur (l'opérateur - n'est pas défini pour le type d'argument T, T)

Merci d'avance. P>

//this method Subtracts Value from the given Matrix for all the rows but for given columns 
private <T> void subtractValueFromColumns(T[][] matrix,
        ArrayList<Integer> columnsIndex, T value) {

    for(int i = 0; i < matrix.length; i++){
        for(int j = 0; j < columnsIndex.size(); j++){
            matrix[i][j] = matrix[i][j] - value;
        }
    }

}


1 commentaires

Alors, que se passe-t-il si j'appelle: Soustraire la valeur des colonnes (nouvelle chaîne [] [] [] {{"A", "B", "C"}, {"D", "F"}} , nouvelle arraylist (), "Z") ?


3 Réponses :


1
votes

Vous devez définir des opérations et des méthodes pouvant être utilisées sur ce type donné.

public class Vector2 implements Serializable, Vector<Vector2> {
    @Override
    public Vector2 scl (float x, float y) {
        this.x *= x;
        this.y *= y;
        return this;
    }

    @Override
    public Vector2 add (Vector2 v) {
        x += v.x;
        y += v.y;
        return this;
    }
}


0 commentaires

1
votes

Vous ne pouvez pas le faire sans casting (ce qui signifie plus ou moins que les génériques sont inutiles ici).

L'opérateur - ne peut être appliqué qu'aux types numériques, mais à la compilation-time Le compilateur ne peut pas être conscient du type d'exécution du type générique t .


comme solution de contournement, je peux suggérer d'utiliser le type bigdecimal et ses méthodes arithmétiques imbriquées (comme .Subrent () ) ) XXX

Ceci a un effet inconvénient, cependant. Afin d'utiliser la méthode correctement, vous serez obligé de convertir vos variables numériques en BigDecimal et vice-versa


0 commentaires

1
votes

- est défini uniquement pour quelques types tels que int et ceux qui peuvent être convertis / non compressés comme integer . La soustraction ne fonctionnera pas avec des types génériques puisque Java n'a aucun moyen de savoir si un type t peut être converti en par exemple. int . Java n'a également pas de surcharge de l'opérateur, ce qui signifie que vous ne pouvez pas définir une signification pour cet opérateur ultérieurement sur des types arbitraires.

Vous pouvez toutefois restreindre t à quelque chose qui a par exemple un moins (t autre) méthode et utilisez cela à la place. Vous pouvez également utiliser numéro au lieu de t et utiliser le .doublevalue () pour faire votre mathématique.

Une autre possibilité est de laisser les clients de cette méthode définir comment l'opération fonctionne comme: xxx


0 commentaires