扩展一个类,以便可以使用Java将任何父类强制转换为它

Ric*_*gle 7 java casting downcast

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

我试图以子类只有新方法,没有新构造函数,没有新字段的方式扩展父类.因此子类的基础数据结构与父类相同.当我想为内置的java类(例如Vector3d)提供附加函数时,这往往会发生.鉴于底层数据是相同的,可以以任何方式将初始化为父类的对象向下转换为子类,以便我可以使用添加的功能.作为我的意思的一个例子,见下文

import javax.vecmath.Vector3d;

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

    public double extraMethod(){
        return x+y+z;
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试使用添加到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());
    }
}
Run Code Online (Sandbox Code Playgroud)

很明显,java对此感到不安,因为通常我们无法保证Vector3dPlus方法适用于所有方法Vector3d.不过反正是有,我可以对Java的基础数据结构是相同的,因此允许所有所有的向下转换说Vector3dVector3dPlus.

我处理这个问题的当前方法是将所有额外的方法放在一个通用的实用程序类中,但这显然有点可怕

jlo*_*rdo 4

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

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

    // rest of your Vector3dPlus code
}
Run Code Online (Sandbox Code Playgroud)

并在您的测试类中重载该方法:

    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
        }
    }
Run Code Online (Sandbox Code Playgroud)