2017-05-10 53 views
8

Mój problem polega na tym, że używam klasy, która nie została opracowana przeze mnie (wziąłem ją z zestawu SDK Microsoft Azure dla Java). Klasa nazywa się Węzeł i można ją zobaczyć here.Jak utworzyć instancję ogólnej klasy rekursywnej w Javie

Jak widać klasę to ogólna klasa zadeklarowana rekurencyjnie tak:

public class Node<DataT, NodeT extends Node<DataT, NodeT>> { 
     ... 
} 

Kiedy próbuję go instancji nie wiem jak to zrobić. Robię to, ale wiem, że to nie jest sposób, ponieważ nie ma końca:

Node<String, Node<String, Node<String, Node<...>>>> myNode = new Node<String, Node<String, Node<String, Node<...>>>>; 

Mam nadzieję, że rozumiesz moje pytanie. Dzięki.

+0

Może deklarowanie tego abstraktu wyjaśniłoby –

+0

@ArneBurmeister Dokładnie mój punkt! Nie pomaga wcale fakt, że klasa 'Node' nie jest abstrakcyjna. –

Odpowiedz

4

Musisz zadeklarować klasę, która rozciąga Node więc można użyć nazwy klasy:

class StringNode extends Node<String, StringNode> { 
} 
5

Jednym ze sposobów jest rozszerzenie Node jak:

class MyNode<T> extends Node<T, MyNode<T>> { 
} 

a następnie oznacz ją jak :

Node<String, MyNode<String>> node1 = new MyNode<String>(); 

lub

MyNode<Integer> node2 = new MyNode<Integer>(); 
+0

Gładki i elastyczny sposób. – davidxxx

2

Można użyć symbolu wieloznacznego w deklaracji zmiennej:

Node<String, ?> n = new Node<>(); 

Lub można utworzyć jawne podklasę

class StringNode extends Node<String, StringNode> { } 

i oznacz ją poprzez

Node<String, ?> n = new StringNode(); 

lub

StringNode n = new StringNode();