У меня есть два класса, Foo1
и Foo2
, которые не связаны иерархически, поэтому экземпляр Foo1
не является экземпляром Foo2
и наоборот.
В классе, отличном от этого, у меня есть метод doStuffWithFoo
, который в идеале должен принимать либо Foo1
, либо Foo2
в качестве входных данных, а затем вести себя соответствующим образом. Вот основная идея, которая мне нужна:
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;
}
где я написал два совершенно разных метода
private double[] getArrayFromFoo(Foo1 foo, Bar bar, double fortyTwo)
private double[] getArrayFromFoo(Foo2 foo, Bar bar, double fortyTwo)
и каждый класс Foo
реализует свой собственный метод getNextFoo()
, который возвращает тот же тип Foo
, который он принимает.
Метод getArrayFromFoo
на самом деле не имеет ничего общего с классами Foo
, и он принимает входные данные от класса, в котором этот метод живет, поэтому нет смысла создавать общий интерфейс для Foo
s.
Я вижу, как справиться с ситуацией:
Заставьте doStuffWithFoo
принять универсальный объект в качестве входных данных, затем проверьте, является ли класс Foo1
, Foo2
или что-то еще. Проблема этого подхода в том, что я настоятельно предпочитаю ошибки времени компиляции, а не ошибки времени выполнения.
Напишите две версии doStuffWithFoo
так же, как я написал две версии getArrayFromFoo
. Проблема с этим подходом состоит в том, что я буду дублировать большой объем кода, который может вызвать несоответствия, когда код изменяется в какой-то момент в будущем.
Есть ли другой вариант? Идеальное решение, которое я имею в виду, - если есть способ объявить тип ввода равным Foo1
или Foo2
, что похоже на подход 1, но с мгновенными ошибками. Есть ли способ сделать это в Java?