Java 通过类层次结构发生的尾部递归
嘿,你们这些人 我在问自己以下问题。这应该在Java中完成,但因为我不知道怎么做,所以一个概念也会有帮助: 我有以下代码:Java 通过类层次结构发生的尾部递归,java,inheritance,recursion,reflection,Java,Inheritance,Recursion,Reflection,嘿,你们这些人 我在问自己以下问题。这应该在Java中完成,但因为我不知道怎么做,所以一个概念也会有帮助: 我有以下代码: public abstract class A { protected enum AType implements AInterface { A_VALUE } public AInterface[] possibleRequests() { AInterface types = AType.values(); ret
public abstract class A {
protected enum AType implements AInterface {
A_VALUE
}
public AInterface[] possibleRequests() {
AInterface types = AType.values();
return ArrayUtils.concat(types, possibleFurtherRequests());
}
public abstract AInterface[] possibleFurtherRequests();
}
public class B extends A {
protected enum BType implements BInterface {
B_VALUE
}
@Override
protected AInterface[] possibleFurtherRequests() {
//Here is my problem.
return BType.values();
}
}
public interface AInterface {
}
public interface BInterface extends AInterface {
}
我想做的是让这些possibleRequest
-方法具有无限的深度。它们应该只能通过A
访问,我不知道A
类型的对象属于哪个类,也不应该知道
我所说的不确定深度的意思是,这个概念是用C扩展B
来扩展的。现在我想访问A
、B
和C
中的所有值。我如何强制,无论何时添加新的子类,程序员都必须定义这些AInterface
-枚举(可选),以及我如何强制他实现一个方法,然后在类层次结构上递归调用该方法(非可选)。
我不需要帮助定义抽象方法,也不需要重写抽象方法。我要做的是不要覆盖现有的类,也不要向每个被调用的继承类添加抽象方法
我真的不知道该怎么问这个问题,但我希望有人能理解我的意思。
如果没有,请留下评论。方法的可见性很重要。您不能强制子类实现现在不抽象的possibleFurtherRequests,但这是它们需要的唯一方法。你也不能强迫他们调用超级方法。代码审查可以很好地实现这一点
protected enum AType implements AInterface {
A_VALUE
}
protected enum BType implements BInterface {
B_VALUE
}
public abstract class A {
final public AInterface[] possibleRequests() {
return possibleFurtherRequests();
}
protected AInterface[] possibleFurtherRequests() {
return AType.values();
}
protected AInterface[] combine(AInterface[] some, AInterface[] more) {
AInterface[] combined = new AInterface[some.length + more.length];
System.arraycopy(some, 0, combined, 0, some.length);
System.arraycopy(more, 0, combined, some.length, more.length);
return combined;
}
}
public class B extends A {
@Override
protected AInterface[] possibleFurtherRequests() {
return combine(super.possibleFurtherRequests(), BType.values());
}
}
public interface AInterface {
}
public interface BInterface extends AInterface {
}
public void test() {
AInterface[] result = new B().possibleRequests();
Stream.of(result).forEach(System.out::println);
}
结果是
A_VALUE
B_VALUE
方法的可见性很重要。您不能强制子类实现现在不抽象的possibleFurtherRequests,但这是它们需要的唯一方法。你也不能强迫他们调用超级方法。代码审查可以很好地实现这一点
protected enum AType implements AInterface {
A_VALUE
}
protected enum BType implements BInterface {
B_VALUE
}
public abstract class A {
final public AInterface[] possibleRequests() {
return possibleFurtherRequests();
}
protected AInterface[] possibleFurtherRequests() {
return AType.values();
}
protected AInterface[] combine(AInterface[] some, AInterface[] more) {
AInterface[] combined = new AInterface[some.length + more.length];
System.arraycopy(some, 0, combined, 0, some.length);
System.arraycopy(more, 0, combined, some.length, more.length);
return combined;
}
}
public class B extends A {
@Override
protected AInterface[] possibleFurtherRequests() {
return combine(super.possibleFurtherRequests(), BType.values());
}
}
public interface AInterface {
}
public interface BInterface extends AInterface {
}
public void test() {
AInterface[] result = new B().possibleRequests();
Stream.of(result).forEach(System.out::println);
}
结果是
A_VALUE
B_VALUE
为什么不从
super.possibleRequests()
获取结果,创建一个新的AInterface[]
,然后将super.possibleRequests()
的结果与当前类的“enumvalue
组合并返回该结果呢?你是对的,这是一种方法。我真是太蠢了。然而,这并不能回答如何实施这种行为的问题。另一个程序员可能很容易忘记调用super.possibleRequests()
。您不能强制继承者执行某些行为,但您可以对其进行Javadoc,以便人们知道您希望他们调用super.possibleRequests
。为什么不从super.possibleRequests()
,创建一个新的AInterface[]
,然后将来自super.possibleRequests()
的结果与当前类的enum值组合,并返回该值?没错,这是一种方法。我真是太蠢了。然而,这并不能回答如何实施这种行为的问题。另一个程序员可能很容易忘记调用super.possibleRequests()
。您不能强制继承者执行某些行为,但您可以对其进行Javadoc,以便人们知道您希望他们调用super.possibleRequests
。