我正在尝试实现一个隔离对象的一部分并用其他东西替换该部分的类。对象的部分可能与对象本身的类型不同。
一个简单的例子是一个类,它接受字符串“--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 中执行此操作(并且仍然具有类型安全性)?
编辑
要清楚,问题是声明一个方法,该方法采用数组ComposableReplacer
并堆栈/链接它们,具有类型安全性。