java - 接口(interface)、继承和子类型

标签 java generics inheritance interface subtype

我有以下 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/

相关文章:

java - 在构建我的应用程序 jar 时包括外部 jar

java - WebSphere 8.5 : unit testing & embeddable container

java - java中异常处理的输出不一致

c# - 将通用 List/Ienumerable 转换为 DataTable?

java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?

java - 具有引用和原始类型的 isAssignableFrom

java - java中未知的父变量问题

javascript - 即使在 false 上,Cordova 相机也会保存到画廊

scala - 何时在 Scala 特征中使用 val 或 def?

c++ - 将继承称为类的EXTEND是否合适