方法编译并使用错误类型的变量传递

时间:2018-10-09 19:09:06

标签: java interface extend

这是我正在测试的代码的一部分:

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;
}

这是我从中调用方法的类: 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);
      }
}

所以问题是由于某种原因,如果我在main中写这样的话:

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));
    }
}

它可以正常工作并返回true,同时它应该编写了一个异常,即VectorND在A进行的Compare调用中应该被期望。这可能是什么问题?

1 个答案:

答案 0 :(得分:1)

问题是您没有覆盖Compare()Vector中基类VectorND的{​​{1}}方法。相反,您要声明在子类中采用相同类型(Vector3DVectorND)对象的新方法。子类中仍然可以使用基类的原始Vector3D方法,而调用Compare()时将调用该方法。

为了更加清楚,您有

A.Compare(B)

因此,当您致电

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){ ... } 
}

并且在类A.Compare(B) 中没有声明Compare(Vector3D),您实际上正在调用

VectorND

因为Vector.Compare(Vector) A都是从基类B派生的。

如果您确实想用子类中的方法覆盖Vector中的Compare方法,则需要在子类中声明它们相同(即,使用相同类型的参数)。

如果您真的希望该方法在指定的情况下引发异常,则需要使用Vector运算符来显式检查Vector的类型,如果类型不同,则抛出异常。

instanceof

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 } } 批注指示您打算覆盖基类中的方法。如果基类中没有匹配方法,例如,如果您尝试这样做

@Override

编译器/ IDE将发出错误,以通知您您没有覆盖任何内容(因为@Override public boolean Compare(Vector3D vec) 类没有Vector方法)。