首先,因为类SimpleGenericClass
是抽象的,所以它是子类的。
其次,它是一个泛型类,这意味着在类内部的某个地方,您几乎肯定会使用泛型参数T
作为字段的类型。
public abstract class SimpleGenericClass<T...> {
T x;
}
现在第一个有趣的事情T
是有界的。因为它被声明为T extends SimpleGenericClass<?>
只能SimpleGenericClass<?>
是SimpleGenericClass<?>
. 您还询问了 thr ?
。这被称为通配符, Java Tutorial on Wildcards中有一个很好的解释。在您的情况下,我们会说这是“未知的 SimpleGenericClass”。例如,它在 Java 中是必需的,因为SimpleGenericClass<Object>
它不是 的超类SimpleGenericClass<String>
。
第二个有趣的事情是,由于T
是SimpleGenericClass
某种类型的,你的类很可能定义 递归结构。我想到的是树(想想表达式树),其中SimpleGenericClass
(抽象)节点类型是(抽象的)节点类型,旨在与各种专门的节点类型进行子类化。
更新 This SO question on self-bounded generics可能对您有所帮助。
更新 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[]{};}
}
这里的好处是这NumberNode[]
是一个有效的返回类型PlusNode.getChildren
!这在实践中重要吗?不知道,但它很酷。:)
这不是最好的例子,但问题是相当开放的(“这样的东西可以用来做什么?”)。当然,还有其他定义树的方法。