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

时间:2014-01-11 04:57:57

标签: java inheritance

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

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?
}

1 个答案:

答案 0 :(得分:1)

嗯,你可以这样做:

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的实例,那么该处理将不会被执行。

唯一的另一种方法是创建一个构造函数或其他实用程序方法,可以使用MyClass中的数据创建新的LibraryClass实例。这可能是也可能是不可能的,这取决于LibraryClass中的字段或getter / setter是私有的还是受保护的/公共的。在不知道LibraryClass的任何细节的情况下,很难说。但我希望它看起来类似于:

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