Я пытаюсь реализовать класс, который изолирует часть объекта и заменяет деталь чем-то другим. Часть объекта может не иметь того же типа, что и сам объект.Функция «состав» и тип безопасности в java
Простым примером может служить класс, который берет строку «--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);
}
}
Теперь я хочу, чтобы иметь возможность составить серию заменителя - складывать их, так что каждый из них рассчитывает свою inner_replace
с помощью «ниже "Заменитель:
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);
}
}
Так далеко, это работает правильно, но теперь я пытаюсь написать удобный метод, чтобы взять пар из ComposableReplacers и складываем их автоматически:
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 (и все еще иметь тип безопасности)?
EDIT Чтобы быть ясно, что проблема объявить метод, который принимает массив ComposableReplacer
и штабели/цепей их, с типобезопасностью.
Используйте шаблон оформления Decorator для создания реализаций Replacer: http://en.wikipedia.org/wiki/Decorator_design_pattern –
Вы не сможете этого сделать, каждый «Replacer» должен либо взять метод в конструкторе, либо возможно, есть метод 'и' - таким образом вы можете безопасно выводить типы возврата. Что-то вроде шаблона «Цепь ответственности» должно работать. –
@ BorisPavlović Я попробовал шаблон декоратора, но та же проблема возникает - нет способа сообщить компилятору типы в массиве 'ComposableReplacer': [здесь ссылка на реализацию] (http://pastebin.com/ReRSwTuA) – goncalopp