是否可以将方法输入作为Java中两个可能的类之一?

Pen*_*One 1 java class class-method

我有两个类,Foo1并且Foo2它们不是分层相关的,所以实例Foo1不是实例,Foo2也不是反过来.

在与这些不同的类中,我有一个doStuffWithFoo理想情况下应该采用Foo1Foo2作为输入的方法,然后相应地表现.这是我追求的基本想法:

private double[] doStuffWithFoo(Fooi foo, Bar bar1, Bar bar2, double fortyTwo) {
    Fooi changingFoo = foo;
    double[] fooBars = new double[N];
    for (int i=0; i<N; ++i) {
        double[] array = getArrayFromFoo(foo,bar1,fortyTwo);
        double fooBar = getDoubleFromArray(array);
        fooBars[i] = fooBar;
        foo = foo.getNextFoo();
    }
    return fooBars;
}
Run Code Online (Sandbox Code Playgroud)

在那里我写了两种截然不同的方法

private double[] getArrayFromFoo(Foo1 foo, Bar bar, double fortyTwo)
private double[] getArrayFromFoo(Foo2 foo, Bar bar, double fortyTwo)
Run Code Online (Sandbox Code Playgroud)

每个Foo类都实现自己的getNextFoo()方法,返回相同类型的方法Foo.

该方法getArrayFromFoo实际上与Foo类没有任何关系,它从此方法所在的类中获取输入,因此为Foos 创建公共接口没有意义.

我认为处理这种情况的方法是:

  1. doStuffWithFoo拿一个通用的对象作为输入,然后检查类是否是Foo1,Foo2或别的东西.这种方法的问题是我非常喜欢编译时错误来运行时错误.

  2. 写两个版本doStuffWithFoo就像我写的两个版本一样getArrayFromFoo.这种方法的问题在于,我将复制大量代码,这些代码在某些时候更改代码时可能会导致不一致.

还有其他选择吗?我想到的理想解决方案是,如果有一种方法可以将输入类型声明为Foo1或者Foo2,这就像方法1但具有即时错误.有没有办法在Java中这样做?

Pau*_*ora 9

尝试定义一个接口:

public interface HasDoubleArray {

   public double[] getDoubleArray();
}
Run Code Online (Sandbox Code Playgroud)

然后让每个Foo1Foo2实现这个接口,覆盖方法getDoubleArray()返回一个double[]以自己特殊的方式.然后你可以在你的导演代码中调用它:

private double[] doStuffWithFoo(HasDoubleArray hda) {
   double[] array = hda.getDoubleArray();
   // DO STUFF WITH array
   return array;
}  
Run Code Online (Sandbox Code Playgroud)


Ted*_*opp 6

那这个呢:

private double[] doStuffWithFoo(Foo1 foo) {
    double[] array = getArrayFromFoo1(foo);
    doCommonStuff(array);
    return array;
}


private double[] doStuffWithFoo(Foo2 foo) {
    double[] array = getArrayFromFoo2(foo);
    doCommonStuff(array);
    return array;
}

private void doCommonStuff(double[] array) {
    // common stuff
}
Run Code Online (Sandbox Code Playgroud)