2013-03-15 8 views
24

Ho un'interfaccia e quando provo ad implementare uno dei suoi metodi, ottengo questo errore: "name clash: enqueue (T # 1) in GenericQueue e enqueue (T # 2) in IGenericQueue hanno la stessa cancellazione, ma nessuno dei due sostituisce l'altro dove T # 1, T # 2 sono variabili di tipo: T # 1 estende Comparable dichiarato in classe GenericQueue T # 2 estende Comparable dichiarata nell'interfaccia IGenericQueue " qui il codice:e una classe. nome clash: stessa cancellazione, ma nessuno dei due esclude gli altri

public interface IGenericQueue <T extends Comparable> { 
public void enqueue(T j); 
.. 
} 

public class GenericQueue<T extends Comparable> implements IGenericQueue { 
.... 

public void enqueue(T j) // the error is in this line. 
{ 
    if(rear == maxSize -1) 
     rear = -1; // means you have reached the last element start again ? 

    queArray[++rear] = j; 
    nItems ++ ; 
} 
} 

risposta

38

tuo GenericQueue sta attuando il grezzo interfaccia IGenericQueue, quindi il suo T è diverso da T in IGenericQueue. Aggiungere il <T> nella clausola implements:

public class GenericQueue<T extends Comparable> implements IGenericQueue<T> { 
//                  ^^^ 

modo si implementa l'interfaccia generica con la stessa T.

2

Stavo riscontrando un problema simile, anche se ho una gerarchia di classi generiche più complicata che segue il modello di modello per la programmazione OO. Dove c'è un'interfaccia quindi un'altra interfaccia che estende quell'interfaccia quindi una classe astratta che implementa quell'interfaccia e quindi le classi che estendono la classe astratta, ma sta ottenendo l'errore "interfaccia e una classe nome clash: stessa cancellazione, ma nessuno dei due esclude altro" E ha trovato che solo quando inserisco o dopo ogni singola classe nella gerarchia e in ogni riferimento a quella classe l'errore scompare. Per esempio:

public interface Set<U> {...} 
public interface SetExtended<U> extends Set<U> {...} 
public abstract class AbstractSetExtended<U> implements SetExtended<U>{...} 
public class Set1<U> extends AbstractSetExtended<U> {...} 
public class Set2<U> extends AbstractSetExtended<U> {...} 

il motivo template è grande per la progettazione modulare, così come il factoring fuori codice comune e buono per il riutilizzo del codice. Per leggere un po 'di più sul modello di modello: https://en.wikipedia.org/wiki/Template_method_pattern

Problemi correlati