Во-первых, поскольку класс SimpleGenericClass
является абстрактным , он должен быть разделен на подклассы.
Во-вторых, это универсальный класс, который означает, что внутрикласс где-то вы почти наверняка будете использовать универсальный параметр T
в качестве типа поля.
public abstract class SimpleGenericClass<T...> {
T x;
}
Теперь first Интересно, что T
is ограниченная .Поскольку он объявлен как T extends SimpleGenericClass<?>
, это может быть только SimpleGenericClass<?>
или некоторый подкласс SimpleGenericClass<?>
.Вы также спросили о THR ?
.Это известно как подстановочный знак, и есть довольно хорошее объяснение этого в Учебник Java по подстановочным знакам .В вашем случае мы бы сказали, что это «SimpleGenericClass of unknown».Это необходимо в 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[]{};}
}
Приятно то, что NumberNode[]
является допустимым типом возвратаза PlusNode.getChildren
!Имеет ли это значение на практике?Понятия не имею, но это довольно круто.:)
Это не самый лучший пример, но вопрос был довольно открытым («для чего может быть использована такая вещь?»).Конечно, есть и другие способы определения деревьев.