Во-первых, поскольку класс SimpleGenericClass
является абстрактным, он должен быть подклассом.
Во-вторых, это универсальный класс, что означает, что где-то внутри класса вы почти наверняка будете использовать универсальный параметр T
в качестве типа поля.
public abstract class SimpleGenericClass<T...> {
T x;
}
Теперь первое интересное здесь то, что T
ограничено. Поскольку он объявлен как 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
! Имеет ли это значение на практике? Без понятия, но это довольно круто. :)
Это не лучший пример, но вопрос был довольно открытым («Для чего такая вещь может быть использована?»). Конечно, есть и другие способы определения деревьев.
person
Ray Toal
schedule
24.09.2011
Simple
илиSample
, или они должны быть разными классами? - person K-ballo   schedule 24.09.2011