我有一个来自库的图像类,我正在尝试扩展。在几种情况下,超类方法返回新的超类对象。如何在超类方法返回的对象上使用子类方法?有没有办法将超类对象更改为子类对象?
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?
}
答案 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());
...
}