[英]Interfaces, inheritance and subtyping
我有以下JAVA混乱情况,我不清楚。
具有两个通用类型A和B的通用接口,例如AIter<A,B>
另一个具有附加通用C类型的通用接口,例如: BIter<A,B,C> extends AIter<A,B>
一个通用类ClassA<D>
,将第一个Interface AIter递归地实现为这样的内部类: ThisIter implements AIter<Something,ThisIter>
另一个通用类ClassB<D,E>
,将第二个接口BIter递归地实现为这样的内部类: ThisIter implements BIter<Something,ThisIter,SomethingElse>
这两个类都有一个名为public ThisIter giveIter();
的函数public ThisIter giveIter();
它应该返回内部类的实例(每个内部类都具有类似的函数,该函数也返回自身的新实例,但是具有不同的参数)。
是否可以将ClassB实现为ClassA的子类型? (鉴于通用类型是相同的,例如ClassA<MyString>
和ClassB<MyString, somethingelse>
)
我似乎无法实现这一目标,因为ThisIter的实例以及GiveIter()的返回类型是不兼容的。
通常会问,子接口的实现是否是接口本身的实现的子类型?
IterA
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);
}
}
我们不能覆盖内部类。 在此处阅读有关可以重写内部类的信息 。
问:是否可以将ClassB实现为ClassA的子类型?
ClassB.getIter()
:是的,您需要为ClassB.getIter()
选择一个不同的名称。 否则,它将抱怨重写的方法具有不同的返回类型或其他内容。 实际上,您并不是要覆盖它,但是编译器无法知道。 因此,您需要为其选择其他名称。
问:通常会问,子接口的实现是否是接口本身的实现的子类型?
答:不,在这种情况下,它将是2个不同的类层次结构。 一个从上到下是interfaceA-> interfaceB-> classD,另一个是interfaceA-> classC。
重新考虑您的命名和代码分解,特别是在每个容器类中是否确实需要一个名为node和edge的类?
这是可编译的东西,类似于您的代码(据我了解的意图)。
interface IterA<A,B> {}
interface IterB<A,B,C> extends IterA<A,B> {}
class ClassA<L> {
NodeA root;
public ClassA() { root= new NodeA(); }
protected class NodeA { }
protected class EdgeA { L varL; }
protected class ThisIterA implements IterA<EdgeA, ThisIterA> { ThisIterA(NodeA root) { } }
public IterA<? extends EdgeA, ? extends IterA> assoc() { return new ThisIterA(root); }
}
class ClassB<L,N> extends ClassA<L> {
NodeB root;
public ClassB() { root= new NodeB(); }
protected class NodeB extends NodeA { N varN; }
protected class EdgeB extends EdgeA { L varL; }
protected class ThisIterB<EA extends EdgeA, TIA extends IterB> implements IterB<EA, TIA, N> { ThisIterB(NodeB root) { } }
public IterB<EdgeB, IterB, N> assoc() { return new ThisIterB<EdgeB, IterB>(root); }
}
这里已经很晚了,所以这是我最后的。 祝你好运,晚安!
不确定这是否有帮助,但是以下内容可以编译
interface AIter<A,B>{}
interface BIter<A,B,C,D extends A,E extends B > extends AIter<A,B>{}
class AClass{
protected class Node {}
protected class Edge {}
public class ThisIter implements AIter<Node,Edge>{};
public ThisIter getIter(){
return new ThisIter();
}
}
class BClass<N> extends AClass{
protected class Node extends AClass.Node{}
protected class Edge extends AClass.Edge{}
public class ThisIter extends AClass.ThisIter implements BIter<AClass.Node,AClass.Edge, N, Node, Edge>{};
@Override
public ThisIter getIter(){
return new ThisIter();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.