这个泛型类声明可能意味着什么?

ano*_*ous 8 java generics generic-programming

我知道这不是一个很好的问题,我可能会被诅咒问它,但我找不到任何地方可以帮助解决这个问题

下面是我的面试问题中出现的通用课程(我已经失败了).问题是告诉这个类声明正在做什么以及在什么情况下可以使用它?

我对通用编程的理解非常有限,但我理解'T'是Type,'extends'在这里意味着Type应该继承'SimpleGenericClass',但我不理解'?' 最后以及在什么情况下这个类可能被用于

public abstract class SimpleGenericClass<T extends SimpleGenericClass<?>> {

}
Run Code Online (Sandbox Code Playgroud)

Ray*_*oal 4

首先,因为类SimpleGenericClass抽象的,所以它应该被子类化。

其次,它是一个泛型类,这意味着在类内部的某个地方您几乎肯定会使用泛型参数T作为字段的类型。

public abstract class SimpleGenericClass<T...> {
    T x;
}
Run Code Online (Sandbox Code Playgroud)

现在这里第一个T有趣的事情是有界的。因为它被声明为T extends SimpleGenericClass<?>只能是SimpleGenericClass<?>或 的某个子类SimpleGenericClass<?>。您还询问了 thr ?这就是所谓的通配符, Java 通配符教程对此有很好的解释。在你的情况下,我们会说这是一个“未知的 SimpleGenericClass”。例如,它在 Java 中是必需的,因为SimpleGenericClass<Object>它不是 的超类。SimpleGenericClass<String>

第二有趣的事情是,既然TSimpleGenericClass某种类型,你的类很可能定义 递归结构。我想到的是树(想想表达式树),其中SimpleGenericClass是(抽象)节点类型,旨在用各种专用节点类型进行子类化。

更新 这个关于自界泛型的问题可能对你有帮助。

更新2

我继续编写了一些代码来说明如何使用它。该应用程序不执行任何操作,但会进行编译,并向您展示通用边界如何提供一些可能有意义的约束。

public abstract class Node<T extends Node<?>> {
    public abstract T[] getChildren();
}

class NumberNode extends Node {
    int data;
    public Node[] getChildren() {return new Node[]{};}
}

class IdentifierNode extends Node {
    int data;
    public Node[] getChildren() {return new Node[]{};}
}

class PlusNode extends Node {
    NumberNode left;
    NumberNode right;
    public NumberNode[] getChildren() {return new NumberNode[]{};}
}
Run Code Online (Sandbox Code Playgroud)

这里的好处是它是!NumberNode[]的有效返回类型。PlusNode.getChildren这在实践中重要吗?不知道,但这很酷。:)

这不是最好的例子,但问题相当开放(“这样的东西可以用来做什么?”)。当然,还有其他方法来定义树。