è possibile:
rimuovere il parametro <T>
tipo da TSTNode
(vale a dire, lo rendono non generico) - avrà ancora accesso all'esterno <T>
.
rinominare il parametro di tipo <T>
nella classe TSTNode
a (ad esempio) U
.
[UPDATE]
Qui di seguito sono quattro modi diversi per riscrivere il codice. Tutti loro compilano. Penso che dovresti prendere in considerazione l'uso di uno EnumMap
(vedi Versione 4, di seguito).
Versione 1: utilizzare un parametro di tipo con nome diverso nella classe interna. devi usare una lista invece di una matrice.
public class TernarySearchTree<T> {
protected class TSTNode<U> {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected List<TSTNode<U>> relatives;
private U data;
protected TSTNode(char splitchar, TSTNode<U> parent) {
this.splitchar = splitchar;
relatives = new ArrayList<TSTNode<U>>();
for (int i = 0; i < HIKID; ++i) { // Allocate 4 slots in relatives
relatives.add(null);
}
relatives.set(PARENT, parent);
}
}
private TSTNode<T> node; // When you use it, pass T as U
public TernarySearchTree() {
node = new TSTNode<T>(',', null); // When you use it, pass T as U
}
}
Versione 2: ereditare T da racchiudere classe
public class TernarySearchTree<T> {
protected class TSTNode {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected List<TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
relatives = new ArrayList<TSTNode>();
for (int i = 0; i < HIKID; ++i) { // Allocate 4 slots in relatives
relatives.add(null);
}
relatives.set(PARENT, parent);
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
Versione 3: utilizzare una mappa (invece di una lista)
public class TernarySearchTree<T> {
protected class TSTNode {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected Map<Integer, TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
// Create a hash map. No need to pre-allocate!
relatives = new HashMap<Integer, TSTNode>();
relatives.put(PARENT, parent); // set -> put
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
}
Versione 4: definisci gli indici come enum + usa un EnunMap (invece di un hashma p)
public class TernarySearchTree<T> {
protected static enum Index {
PARENT, LOKID, EQKID, HIKID;
}
protected class TSTNode {
protected char splitchar;
protected EnumMap<Index, TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
// Create an EnumMap.
relatives = new EnumMap<Index, TSTNode>(Index.class);
relatives.put(Index.PARENT, parent);
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
[Aggiornamento 2] Una cosa da tenere a mente: Use EnumMap instead of ordinal indexing
Se si ottiene un errore di compilazione, si dovrebbe includere ** ** l'errore di compilazione messaggio nella tua domanda! Ma funziona bene per me. Assicurati di liberarti di "" anche sulla tua * dichiarazione * di 'parenti'. Detto questo, puoi sempre rendere 'TSTNode' statico e utilizzare solo un parametro diverso, come' E'. –
Perché non è possibile creare array generici: http://stackoverflow.com/questions/2927391/whats-the-reason-i-cant-create-generic-array-types-in-java –
Il TSTNode deve accedere campi o metodi di istanza da TernarySearchTree? –