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)
首先,因为类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>
第二个有趣的事情是,既然T是SimpleGenericClass某种类型,你的类很可能定义 递归结构。我想到的是树(想想表达式树),其中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这在实践中重要吗?不知道,但这很酷。:)
这不是最好的例子,但问题相当开放(“这样的东西可以用来做什么?”)。当然,还有其他方法来定义树。