我有一个课程,我无法访问其来源。
public class IDontHaveAccessToSource {...}
我想添加一些方法,如下:
public class MyClass extends IDontHaveAccessToSource {
myMethod1() {...}
myMethod2() {...}
@Override
methodInIDontHaveAccessToSource(){...}
}
但每当我想要将ClassCastException
投放到IDontHaveAccessToSource
的任何内容时,它都会给我一个MyClass
。
我该怎么做?
我不想使用
public class MyClass {
IDontHaveAccessToSource obj;
MyClass(IDontHaveAccessToSource obj) {
this.obj = obj;
}
...
}
并且IDontHaveAccessToSource
没有任何构造函数可用。它被创造了#39;通过调用另一个类的函数:
IDontHaveAccessToSource obj = loadObject(filename);
答案 0 :(得分:1)
你根本无法做到。使用 new Super()创建的对象无法转换为子类对象。如果可能的话,你就可以打破良好的面向对象编程的所有规则。
您只能环绕此类对象。例如,可以考虑装饰器或外观模式。
答案 1 :(得分:0)
由于内存中没有与子类的特定部分相关的对象数据,因此无法将更通用的类的对象强制转换为更具体的类。 比如说,你有一个有字段fA的A类。当您实例化该类的对象时,该字段将被初始化并占用内存中的某些位置。现在,通过添加字段fB将类A扩展为B.您创建一个在内存中分配fA和fB的对象。
a aObj = new B();是一个正确的演员,因为A知道aF,一旦你访问fA,它将在内存中找到该字段;
B bObj = new A();这是因为参考bF将不会成功(A的实例没有在内存中分配fB)