Java 从外部Jar向下投射实例
嗨, 我想扩展一个从外部Jar获取的实例,并覆盖一个方法getId()。我不控制实例的创建,所以我得到的唯一解决方案是将其传递给我的构造函数并手动初始化所有成员,示例如下:Java 从外部Jar向下投射实例,java,downcast,Java,Downcast,嗨, 我想扩展一个从外部Jar获取的实例,并覆盖一个方法getId()。我不控制实例的创建,所以我得到的唯一解决方案是将其传递给我的构造函数并手动初始化所有成员,示例如下: //Class defined in external jar class A{ many methods... public getId() {}; } //I want to extends this class and overwrite single method class MyA extends
//Class defined in external jar
class A{
many methods...
public getId() {};
}
//I want to extends this class and overwrite single method
class MyA extends A{
private int myId;
public getId() {return myId};
}
void main ()
{
A a = Factory.getA(); //External class create the instance
MyA mya = (MyA)a; //runtime Error!! I want to convert A to myA
}
有更好的方法吗?MyA MyA=(MyA)a//运行时错误!!我想把A转换成myA
是MyA的
实例吗??如果它不是
MyA的实例,则无法转换。您将获得java.lang.ClassCastException
,而不是在MyA
的构造函数中从A
获取所有数据(从而完全重新实现它),创建一个,更改所需的方法,剩下的只是将调用传递到A
的原始实例:
class MyA extends A{
private int myId;
public MyA(A a, int myId)
{
this.myId = myId;
//init all other methods from a.? to this.?
this.setXXX(a.getXXX());
this.setYYY(a.getYYY());
....many methods...
}
public getId() {return myId};
}
然后,当然,将其用作:
class MyA extends A{
private A adaptee;
private int myId;
public MyA(A adaptee, int myId)
{
this.adaptee = adaptee;
this.myId = myId;
}
// Override the method you need to
@Override
public getId() {return myId};
...
// Override the rest of the methods so they call the adaptee.
@Override
public X getXXX() {
return a.getXXX();
}
@Override
public void setXXX(X x) {
a.setXXX(x);
}
...
}
不,没有更好的办法了。您不能将A
向下转换为MyA
,就像您不能将对象
向下转换为字符串一样。工厂创建了一个A
,它将保持为A
,除非您以某种方式将其转换为MyA
,例如使用构造函数。您可以使用反射来修改A的行为。
A a = new MyA(Factory.getA(), myId);
... a.getId();