gpt4 book ai didi

java - 在 Java 中扩展一个类,以便可以将任何父类强制转换为它

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:38 24 4
gpt4 key购买 nike

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

我正在尝试以子类只有新方法、没有新构造函数、没有新字段的方式扩展父类。所以子类的底层数据结构与父类完全相同。当我想为内置的 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
}
}

关于java - 在 Java 中扩展一个类,以便可以将任何父类强制转换为它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16274827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com