我觉得这是不可能的,但如果不是这样,那将非常有用。

我正在尝试扩展父类,以使子类仅具有新方法,没有新构造函数,没有新字段。因此,子类的基础数据结构与父类相同。当我想给内置的Java类(例如Vector3d)提供附加功能时,往往会发生这种情况。假设基础数据是相同的,则有可能以任何方式将初始化为父类的对象下放到子类,因此我可以使用添加的功能。作为我的意思的示例,请参见下文

import javax.vecmath.Vector3d;

public class Vector3dPlus extends Vector3d{
    //same fields, same constructors as Vector3d

    public double extraMethod(){
        return x+y+z;
    }
}

尝试使用添加到Vector3d的新方法
import javax.vecmath.Vector3d;

public class Test {

    public static void main(String[] args) {
        Vector3d basic=new Vector3d(1,2,3);

        useExtraMethod(basic); //this line correctly raises an exception, but is there a way around that
    }

    public static void useExtraMethod(Vector3dPlus plus){
        System.out.println(plus.extraMethod());
    }
}

显然,java对此感到不安,因为通常我们不能保证Vector3dPlus方法将与所有Vector3d一起使用。但是无论如何,我可以对java说底层的数据结构是相同的,因此允许从所有Vector3dVector3dPlus的所有下转换。

我目前的处理方式是将所有其他方法都放在通用工具类中,但这显然有点可怕

最佳答案

您可以通过方法重载和复制构造函数来实现:

public class Vector3dPlus extends Vector3d {
    public Vector3dPlus(Vector3d vector) {
        super( ... ); // parameters from vector
    }

    // rest of your Vector3dPlus code
}

并在您的测试类中,重载方法:
    public class Test {

        public static void useExtraMethod(Vector3d vector) {
            useExtraMethod(new Vector3dPlus(vector));
        }

        public static void useExtraMethod(Vector3dPlus plus){
             System.out.println(plus.extraMethod());
        }

        public static void main(String[] args) {
           Vector3d basic=new Vector3d(1,2,3);
           useExtraMethod(basic); // this line works now
        }
    }

10-05 18:15