我有以下 JAVA 困惑,我对此非常不清楚:
具有两个通用类型 A 和 B 的通用接口(interface),例如 AIter<A,B>
另一个带有附加通用 Type C 的通用接口(interface),如下所示:BIter<A,B,C> extends AIter<A,B>
一个泛型类,ClassA<D>
,它递归地将第一个 Interface AIter 实现为内部类,如下所示: ThisIter implements AIter<Something,ThisIter>
另一个泛型类,ClassB<D,E>
,它递归地将第二个接口(interface) BIter 实现为内部类,如下所示: ThisIter implements BIter<Something,ThisIter,SomethingElse>
这两个类都有一个名为 public ThisIter giveIter();
的函数它应该返回内部类的一个实例(每个内部类都有一个类似的函数,它也返回其自身的一个新实例,但具有不同的参数)。
是否可以将 ClassB 实现为 ClassA 的子类型? (假设通用类型是相同的,例如 ClassA<MyString>
和 ClassB<MyString, somethingelse>
)
我似乎无法实现这一点,因为 ThisIter 的实例以及 GiveIter() 的返回类型不兼容。
通常会问,子接口(interface)的实现是否是接口(interface)本身的实现的子类型?
迭代A
public interface IterA<A,B> {}
IterB
public interface IterB<A,B,C> extends IterA<A,B> {}
A类:
public class ClassA<L> {
Node root;
public ClassA() {
root= new Node();
}
protected class Node {
/*...*/
}
protected class Edge {
/*...*/
L varL;
}
protected class ThisIter implements IterA<Edge,ThisIter> {
/*...*/
}
public IterA<Edge,ThisIter> assoc() {
return new ThisIter(root);
}
}
B类:
public class ClassB<L,N> {
Node root;
public ClassB() {
root= new Node();
}
protected class Node {
/*...*/
N varN;
}
protected class Edge {
/*...*/
L varL;
}
protected class ThisIter implements IterB<Edge,ThisIter,N> {
/*...*/
}
public IterB<Edge,ThisIter,N> assoc() {
return new ThisIter(root);
}
}
最佳答案
我们无法重写内部类。阅读 here关于内部类是否可以被重写。
问。是否可以将 ClassB 实现为 ClassA 的子类型?
A.是的,您需要为 ClassB.getIter()
选择不同的名称。否则,它会提示重写的方法有不同的返回类型或其他东西。事实上,您并不打算覆盖它,但编译器无法知道。因此,您需要为其选择其他名称。
问。通常会问,子接口(interface)的实现是否是接口(interface)本身的实现的子类型?
A.不,在这种情况下,这将是两个不同的类层次结构。从上到下一个是interfaceA -> interfaceB -> classD,另一个是interfaceA -> classC。
关于java - 接口(interface)、继承和子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4244756/