Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从外部Jar向下投射实例_Java_Downcast - Fatal编程技术网

Java 从外部Jar向下投射实例

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

嗨, 我想扩展一个从外部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 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();