2012-12-20 11 views
5

Ho il seguente nella mia classe piano di lavoro come un fascino:Java non può accedere proprietà di classe superiore nel metodo ridefinito di sottoclasse

public class TestA<E extends Test> 
{ 
     List<Vector<E>> list; 
     String name, location; 

     TestA(String name, String location) 
     { 
      this.name = name; 
      this.location = location; 
      list = new ArrayList<Vector<E>>(); 
     } 

     void populate(Test[] arr) 
     { 
      for(Vector<E> vk : list) 
      { 
        // Code here... 
      } 
     } 

}  

class OrderedTest<E extends Test> extends TestA { 

     OrderedTest(String name, String location) 
     { 
      super(name, location); 
     } 

     void populate(Test[] arr) 
     { 
      for(Vector<E> vk : list) // ERROR: Cannot convert from element Object to Vector<E> 
      { 
        // Code here... 
      } 
     } 

} 

Quando provo ad estendere populate() nel mio sottoclasse voglio fondamentalmente lo stesso metodo solo qui voglio le cose ordinate quindi estraggo ogni vettore in un metodo quicksort ma non ottengo altri problemi a parte: // ERROR: Cannot convert from element Object to

EDIT: Dovrei implementare Iterator per TestA?

+1

Perché stai usando 'Vector's? –

+0

Sto leggendo un libro su Algorithms e Data Structures e sto solo sperimentando ciò che ho letto. Capisco che i vettori sono vecchi e dep. –

risposta

9

Come codificato, i due usi di "E" come parametro generico sono indipendenti e disconnessi. Vector<E> in una classe non significa uguale a Vector<E> nell'altra.

modificare la dichiarazione sottoclasse a:

class OrderedTest<E extends Test> extends TestA<E> 

e la E nelle dichiarazioni superclasse è lo stesso E come in OrderedTest.

+0

Non mi sento stupido ora:). Grazie mille amico. –

1

È dichiarata generico

class TestA<E> 

definire un campo di tipo List < Vector < E>>, significa che il vettore conterrà elementi di tipo E, che significano anche che se non si definisce E , quando l'istanza della sottoclasse TestA il vettore sarà Vector.

La classe bambino anche un generico è definito come:

class OrderedTest<E extends Test> extends TestA 

definire questo generico riutilizzando la lettera 'E' non si lega alla classe padre. Detto questo non hai definito il tipo di classe E padre, e questo è il motivo per cui è Object (il tipo predefinito).

Se si desidera definire il tipo generico di classe padre di essere la stessa della classe figlia è necessario definire come: per

class OrderedTest<E extends Test> extends TestA<E> 

nota che la lettera 'E' qui non ha alcuna connessione con il padre 'E' parametro, e può essere qualsiasi lettera dal momento che è un parametro per la classe OrderedTest, hai appena deciso di utilizzare questo parametro di tipo per essere quello che definisce anche il parametro di tipo padre. Così si può fare per esempio:

class OrderedTest<T extends Test> extends TestA<T> 

La cosa importante è quello di definire il tipo di proprietà di classe padre con quello che verrà definito al bambino, in modo da poter accedere al campo lista aspettandosi gli stessi tipi di dati.

Problemi correlati