Я пытаюсь реализовать класс, который изолирует часть объекта и заменяет часть чем-то другим. Часть объекта может не иметь того же типа, что и сам объект.
Простым примером может быть класс, который берет строку "-12--", изолирует номер ascii и заменяет ее следующим натуральным числом. Таким образом, вся последовательность будет "--12--" -> "12" -> 12 -> 13 -> "13" -> "--13--"
.
С учетом этого я реализовал следующее:
public abstract class Replacer<Outer, Inner>
{
protected abstract Inner decompose(Outer something);
protected abstract Outer compose(Inner something);
protected abstract Inner inner_replace(Inner something);
public Outer replace(Outer something)
{
Inner s = decompose(something);
s = inner_replace(s);
return compose(s);
}
}
Теперь я хочу иметь возможность составлять серию Replacers - складывать их, чтобы каждый из них вычислял свой inner_replace
с помощью "нижнего" Replacer:
public abstract class ComposableReplacer<Outer, Inner> extends Replacer<Outer, Inner>
{
protected Replacer<Inner, ?> child;
@Override
public Outer replace(Outer something)
{
Inner s = decompose(something);
s = inner_replace(s);
if (child!=null)
s= child.replace(s);
return compose(s);
}
}
Итак, да, это работает правильно, но теперь я пытаюсь написать метод удобства несколько композитных рельефов и автоматически складывать их:
public static <I, O> ComposableReplacer<I, O> compose(ComposableReplacer<?, ?>... rs)
{
for (int i=0; i<rs.length-1; i++)
rs[i].child= rs[i+1];
return rs[0];
}
Это не удается, так как каждый внутренний тип ComposableReplacer должен быть внешним типом своего дочернего элемента, и компилятор не может сделать вывод, что из массива ComposableReplacer<?, ?>
.
Возможно ли это сделать в java (и по-прежнему иметь безопасность типов)?
ИЗМЕНИТЬ
Чтобы быть ясным, проблема заключается в объявлении метода, который принимает массив ComposableReplacer
и стекирует/цепочки, с безопасностью типа.