Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 函数使用依赖于两个不同包的对象_Java_Oop - Fatal编程技术网

Java 函数使用依赖于两个不同包的对象

Java 函数使用依赖于两个不同包的对象,java,oop,Java,Oop,我将sama java对象TestData放在包(A&B)中。我创建了一个函数,用于处理标准业务功能的对象 CommonFunc.java: import A.TestData ; class CommonFunc { /// ..... public static TestData processTestData(Date d1, String s1){ TestData testData = new TestData (); /// set

我将sama java对象TestData放在包(A&B)中。我创建了一个函数,用于处理标准业务功能的对象

CommonFunc.java:

import A.TestData ;
class CommonFunc
{
  ///  .....

    public static TestData processTestData(Date d1, String s1){

        TestData testData = new TestData ();

        /// set some testData  porperties based on d1 and s1
        /// e.g : testData.setInitialDate(d1);

        return testData ;
    }
}
这里的问题是编译器必须从其中一个包(比如包(A))加载对象,因此当我期望数据从包(B)返回到局部变量时,我会得到不兼容的类型错误:

使用B TestData的文件,需要调用函数processTestData:

import B.TestData;

// ...

TestData obj = CommonFunc.processTestData(new Date(), "test");

// ...
有没有办法克服这一问题,使两者保持一个共同的功能

有没有办法克服这一问题,使两者保持一个共同的功能

不,是的。在一般情况下,你不能

但是您可以,IFF您可以使两个类采用相同的接口,在相同的接口中声明公共方法。请参见下文,并对类名的更改表示歉意:

interface C {
  public Date getA();
  public void setA(Date a);

}
interface C_Factory <X extends C> {
  X createInstance();
}

class C1 implements C {
  Date a;
  int b;

  public C1() {
    super();
  }

  public Date getA() { return a;  }
  public void setA(Date a) {  this.a = a;  }


  public int getB() { return b; }
  public void setB(int b) {  this.b = b;  }
}

class C2 implements C {
  Date a;
  float b;

  public C2() {
    super();
  }

  public Date getA() { return a;  }
  public void setA(Date a) {  this.a = a; }


  public float getB() { return b; }
  public void setB(float b) {  this.b = b;  }
}

public class CommonFunc {
  // You need this extra param to create instances----
  //                                                 V
  static <X extends C> X doSomething(Date d, Class<X> clazz)
  throws InstantiationException, IllegalAccessException
  // You'll have to accept those exceptions as well
  {
    // the next statement uses clazz as a factory for new X instances
    // As such, you can abstract the method further and use
    // a custom Factory class instead.
    X toret=clazz.newInstance();
    toret.setA(d);
    // something else

    return toret;
  }

  // A custom factory variant of the above
  static <X extends C> X doSomething(Date d, C_Factory<X> factory)
  {
    X toret=factory.createInstance();
    toret.setA(d);
    // something else

    return toret;
  }

  static public void main(String[] args) {
    try {
      C1 c1=doSomething(new Date(), C1.class);
      C2 c2=doSomething(new Date(), C2.class);
    } catch (InstantiationException | IllegalAccessException e) {
      // Should not happen
      e.printStackTrace();
    }
  }
}
接口C{
公共日期getA();
公共无效setA(日期a);
}
接口C_工厂{
X createInstance();
}
类C1实现C{
日期a;
int b;
公共C1(){
超级();
}
public Date getA(){return a;}
公共无效setA(日期a){this.a=a;}
public int getB(){return b;}
public void setB(int b){this.b=b;}
}
C2类实现了C{
日期a;
浮球b;
公共C2(){
超级();
}
public Date getA(){return a;}
公共无效setA(日期a){this.a=a;}
公共浮点getB(){return b;}
public void setB(float b){this.b=b;}
}
公共类CommonFunc{
//您需要这个额外的参数来创建实例----
//五
静态X剂量仪(日期d,类别)
抛出实例化异常,IllegalAccessException
//你也必须接受这些例外情况
{
//下一条语句使用clazz作为新X实例的工厂
//因此,您可以进一步抽象该方法并使用
//而是一个自定义的工厂类。
X toret=clazz.newInstance();
"毛"(d),;
//别的
返回托雷特;
}
//上述产品的定制工厂变体
静态X剂量测量(日期d,C_工厂)
{
X toret=factory.createInstance();
"毛"(d),;
//别的
返回托雷特;
}
静态公共void main(字符串[]args){
试一试{
C1=剂量测定法(新日期(),C1.class);
C2=剂量测定法(新日期(),C2.class);
}捕获(实例化异常|非法访问异常e){
//不应该发生
e、 printStackTrace();
}
}
}

我不认为在您发布的上述示例中,最好的解决方法是将TestData作为一个接口,并在两个包中实现。然后,为了决定是返回TestDataImpl还是返回B TestDataImpl,请在processData中获取另一个参数,为简单起见,让我们假设一个布尔值。基于true或false实例化TestDataImpl或B TestDataImpl并返回相同的值。其中processData的返回类型是接口类型


这可能是重用processData方法最直接的方法。

为什么有两个不同的
TestData
类?这是因为它是由两个不同的XSD自动生成的,它们似乎具有相似的元素