有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

下面是我正在测试的部分代码:

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

所以问题是,出于某种原因,如果我主要写这样的东西:

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,而它本应该编写一个异常,在从A调用Compare时,VectorND是预期的。会出现什么问题


共 (1) 个答案

  1. # 1 楼答案

    问题是您没有在VectorNDVector3D中重写基类VectorCompare()方法。相反,您正在声明新方法,这些方法在子类中接受相同类型的对象(VectorNDVector3D)。基类的原始Compare()方法在子类中仍然可用,当您调用A.Compare(B)时,get调用的就是这个方法

    更清楚地说,你有

    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)
    

    在类VectorND中没有Compare(Vector3D)声明,您真正做的是调用

    Vector.Compare(Vector)
    

    因为AB都是从基类Vector派生的

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

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

    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注释表示您打算重写基类中的方法。如果基类中没有匹配方法,例如

    @Override
    public boolean Compare(Vector3D vec)
    

    编译器/IDE将发出一个错误,通知您没有重写任何内容(因为Vector类没有Compare(Vector3D vec)方法)