Méthode compile et fonctionne avec un mauvais type de variable passée

Mak:

Voici donc partie du code qui je teste:

interface sample
{
    Vector Sum(Vector vec);
    Vector Subtraction(Vector vec);
    int Product(Vector vec);
    boolean Compare(Vector vec);
    String ToString();
}

abstract class Vector implements sample
{       
     int[] coordinates; 
     public Vector (int[] coordinates)
     {
         this.coordinates=coordinates;
     }
}

abstract Vector resVec();

public boolean Compare(Vector vec)
{
    if (this.coordinates.length == vec.coordinates.length)
    {
        for (int i = 0; i<vec.coordinates.length; i++)
        {
            if (this.coordinates[i] == vec.coordinates[i])
                continue;
            else return false;
        }
    }
    else 
    {
        throw new ArithmeticException("Can't compare vectors of different length");
    }
    return true;
}

Et voici les classes que j'appelle les méthodes de: 1)

class Vector3D extends Vector
{

public Vector3D(int n1,int n2,int n3) 
{
    super(new int[]{n1,n2,n3});
}
public Vector3D resVec()
{
    Vector3D resVec = new Vector3D(0,0,0);
    return resVec;
}

public boolean Compare(Vector3D vec)
{
    return super.Compare(vec);
}

2)

class VectorND extends Vector
{
    public VectorND(int...n) 
    {       
            super(n);
    }
    public VectorND resVec()
    {
        VectorND resVec = new VectorND();
        return resVec;
    }

    public boolean Compare(VectorND vec)
      {
          return super.Compare(vec);
      }
}

Le problème est que, pour une raison quelconque, si j'écris quelque chose comme ça dans le principal:

public class main {

    public static void main(String[] args) 
    {
        Vector3D B = new Vector3D(1,-3,3);
        VectorND A = new VectorND(1,-3,3);
        System.out.println(A.Compare(B));
    }
}

Il fonctionne parfaitement et retourne vrai alors qu'il aurait dû écrit une exception VectorND était attendue à l'appel de comparer de A. Quel pourrait être le problème?

Magnus:

Le problème est que vous n'êtes pas redéfinissant la Compare()méthode de la classe de base Vectordans VectorNDet Vector3D. , Vous êtes au lieu de déclarer de nouvelles méthodes qui prennent un objet du même type ( VectorNDou Vector3D) dans vos sous - classes. L'original Compare()méthode de la classe de base est toujours disponible dans les sous - classes, et il est cette méthode get est appelée lorsque vous appelez A.Compare(B).

Pour le rendre plus clair, vous avez

Vector{
    public boolean Compare(Vector vec){ ... }
}

class Vector3D extends Vector {
    public boolean Compare(Vector vec){ ... }
    public boolean Compare(Vector3D vec){ ... } 
}

class VectorND extends Vector {
    public boolean Compare(Vector vec){ ... }
    public boolean Compare(VectorND vec){ ... } 
}

Donc, lorsque vous appelez

A.Compare(B)

et il n'y a pas Compare(Vector3D)déclaré en classe VectorND, ce que vous faites vraiment est appel

Vector.Compare(Vector)

puisque les deux Aet Bsont dérivées de la classe de base Vector.

Si vous voulez vraiment remplacer la Compareméthode Vectoravec ceux de vos sous - classes, vous devez les déclarer de manière identique dans les sous - classes (ie avec le même type de paramètre).

Et si vous vraiment voulez que la méthode pour lancer une exception dans le cas spécifié, vous devez vérifier explicitement le type de Vectorl'aide de l' instanceofopérateur, et lancer une exception si ce n'est pas le même type.

public class Vector3D extends Vector {
    @Override
    public boolean Compare(Vector vec){
        if( !(vec instanceof Vector3D) )
            throw new IllegalArgumentException("Vector3D can only be compared to Vector3D!");

        // Compare and return true or false
    }
}

L' @Overrideannotation indique que vous avez l' intention de passer outre une méthode dans la classe de base. S'il n'y a pas de méthode correspondante dans la classe de base, par exemple , si vous essayez de faire

@Override
public boolean Compare(Vector3D vec)

le compilateur / IDE émettra une erreur pour vous informer que vous n'êtes pas quoi que ce soit primordial (puisque la Vectorclasse n'a pas de Compare(Vector3D vec)méthode).

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=218193&siteId=1
conseillé
Classement