У меня есть следующий беспорядок JAVA, который мне очень непонятен:
универсальный интерфейс с двумя универсальными типами A и B, такой как AIter<A,B>
другой универсальный интерфейс с дополнительнымуниверсальный тип C, например: BIter<A,B,C> extends AIter<A,B>
один универсальный класс, ClassA<D>
, который рекурсивно реализует первый интерфейс AIter как внутренний класс, например: ThisIter implements AIter<Something,ThisIter>
другой универсальный класс, ClassB<D,E>
, который рекурсивно реализует второй интерфейс BIter как внутренний класс, например: ThisIter implements BIter<Something,ThisIter,SomethingElse>
Оба класса имеют функцию с именем public ThisIter giveIter();
, которая должна возвращать экземпляр внутреннего класса (каждыйвнутренних классов имеет аналогичную функцию, которая также возвращает новый экземпляр самого себя, но с другим параметром).
Возможно ли реализовать ClassB как подтип ClassA?(Учитывая, что универсальные типы одинаковы, например, ClassA<MyString>
и ClassB<MyString, somethingelse>
)
Я не могу этого сделать, потому что экземпляры ThisIter и, следовательно, возвращаемые типы giveIter ()несовместимы.
Обычно спрашивается, является ли реализация подынтерфейса (n) когда-либо подтипом реализации самого интерфейса?
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);
}
}