java - 有没有办法将父类(super class) obj 更改为子类 obj?

标签 java inheritance

我有一个来自图书馆的图像类,我正在尝试扩展。在某些情况下,父类(super class)方法会返回新的父类(super class)对象。如何在父类(super class)方法返回的对象上使用子类方法?有没有办法将父类(super class)对象更改为子类对象?

public class LibraryClass extends SomeBaseClass {
    LibraryClass someMethodThatChangesDataReturningNewObject() {
    }
}

public class MyClass extends LibraryClass {
    // methods that extends functionality

    // possible to override superclass method calling it and turning the LibraryClass 
    // obj into a MyClass obj and return that?
}

someRandomMethod() {
    MyClass obj = new MyClass;
    LibraryClass newObj = obj.someMethodThatChangesDataReturningNewObject();
    // possible to bind my subclass methods to newObj?
}

最佳答案

好吧,你可以这样做:

MyClass obj = new MyClass();
MyClass newObj = (MyClass) obj.someMethodThatChangesDataReturningNewObject();

您只需要确保您的 MyClass.someMethodThatChangesDataReturningNewObject() 实现确实返回 MyClass 的实例。如果该方法的实现仅调用父实现,那么将转换包装在 if 语句中会更安全,如下所示:

MyClass obj = new MyClass();
LibraryClass newLibraryClass = obj.someMethodThatChangesDataReturningNewObject();
if (newLibraryClass instanceof MyClass) {
    MyClass newObj = (MyClass) newLibraryClass;
    // MyClass specific processing here
}

在这种情况下,如果对象不是 MyClass 的实例,您将不会得到 ClassCastException。请记住,如果它不是 MyClass 的实例,则不会执行该处理。

唯一的其他方法是创建一个构造函数或其他实用方法,可以使用 LibraryClass 中的数据创建新的 MyClass 实例。这可能可行,也可能不可能,具体取决于 LibraryClass 中的字段或 getter/setter 是私有(private)的还是 protected /公共(public)的。在不了解 LibraryClass 的任何细节的情况下,很难说。但我希望它看起来类似于:

MyClass(LibraryClass libraryClass) {
    this.setField1(libraryClass.getField1());
    this.setField2(libraryClass.getField2());
    ...
}

关于java - 有没有办法将父类(super class) obj 更改为子类 obj?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21058692/

相关文章:

java - 覆盖 DropWizard ConstraintViolation 消息

Python 类外键继承

java - 从返回的 HashMap 中获取列表

c++ - 尝试在 Qt 中继承 QLCDNumber 的问题

Javascript:名为 "name"的属性在 chrome/ff 中为空,在 IE 中则不然

c++ - 当成员变量的大小只为派生类所知时,如何在基类函数中使用成员变量

java - 创建给定类类型的实例

java - 在通用树中找到下一个更大的节点?

java - 如何将 AWS KMS 与 java sdk 结合使用,以便能够将 IAM 凭证解析为 ECS env?

java - 递归删除java中的文件夹