Java 有没有办法将超类obj更改为子类obj?

Java 有没有办法将超类obj更改为子类obj?,java,inheritance,Java,Inheritance,我有一个库中的图像类,我正在尝试扩展它。在几种情况下,超类方法返回新的超类对象。如何对超类方法返回的对象使用子类方法?有没有办法将超类对象更改为子类对象 public class LibraryClass extends SomeBaseClass { LibraryClass someMethodThatChangesDataReturningNewObject() { } } public class MyClass extends LibraryClass { /

我有一个库中的图像类,我正在尝试扩展它。在几种情况下,超类方法返回新的超类对象。如何对超类方法返回的对象使用子类方法?有没有办法将超类对象更改为子类对象

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是私有的还是受保护的/公共的。如果不知道
LibraryClass
的任何细节,很难说。但我希望它看起来类似于:

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

Valek-如果你是指(图书馆类)obj。我想我的问题不清楚。如果你的意思是(我的班级)newObj,那是我的理解不起作用。我想知道是否有一种方法可以创建一个复制构造函数,它接受一个超类并返回一个子类。或者其他一些使宽类变窄的方法。从超类到子类。你为什么要这样做?如果需要将newObj传递到一个需要MyClass的方法中,那么只要遵循Liskov替换原则,就应该能够做到这一点。你真正的问题是什么?撒谎-你可能是对的,我可能从错误的角度来看这个问题。我想保持它的通用性,因为这是一门大学课程(没有作弊),但我需要对图片的数据做一些处理(水平翻转),并希望使用类似flipHorizontal的方法创建一个继承类。但是我需要先使用基类中的其他方法,然后再使用flipHorizontal来更改图片的其他方面。它们返回基类。