2016-05-04 5 views
0

Ich habe folgende Methoden definiert in SchnittstelleNicht in der Lage mit Generika-Methode überschrieben

public interface Stack<T> { 
    void method1(T element); 
    T method2(); 
} 

Klasse diese Schnittstelle implementieren implementiert diese Methoden als

private List<T> elements; 

@Override 
public void method1(T element) { 
    elements.add(element); 
} 

@Override 
public T method2() { 
    return elements.remove(elements.size() - 1); 
} 

Damit folgt ich für method1 folgende Fehlermeldung erhalten: Methode Überschreibt die Methode nicht von der Superklasse, während Methode2 funktioniert.

Irgendeine Idee was mache ich falsch?

+3

Wie wird 'in Ihrer Schnittstelle und implementierende Klasse T'defined definieren? – Preuk

+0

Ich wette ein Nickel, dass Sie so etwas wie diese Klasse YourClass Stacks implementiert haben, oder? – Tom

Antwort

0

Das funktioniert völlig in Ordnung:

import java.util.ArrayList; 
import java.util.List; 

public class Main { 

    interface MyStack<T> { 
     void push(T item); 
     T pop(); 
    } 

    static class MyStackImpl<T> implements MyStack<T> { 
     private List<T> items = new ArrayList<T>(); 
     @Override 
     public void push(T item) { 
      items.add(item); 
     } 

     @Override 
     public T pop() { 
      return items.remove(items.size() - 1); 
     } 
    } 

    public static void main(String[] args) { 
     MyStack<Integer> stack = new MyStackImpl<Integer>(); 
     stack.push(42); 
     System.out.println(stack.pop()); 
    } 
} 
0

Sie müssen auch Typ-Parameter an die Schnittstelle und die Klasse hinzuzufügen:

public interface Stack<T> { // here it is: <T> 

    void method1(T element); 

    T method2(); 
} 

public class Impl<T> implements Stack<T> { // and here too 

    private List<T> elements; 

    @Override 
    public void method1(T element) { 
     elements.add(element); 
    } 

    @Override 
    public T method2() { 
     return elements.remove(elements.size() - 1); 
    } 
} 
+0

Beachten Sie, dass OPs-Schnittstelle bereits einen generischen Typ akzeptiert, aber aufgrund einer falschen Formatierung nicht angezeigt wurde. Ich denke, dass OP vergessen hat, den generischen Typ in seiner Klasse hinzuzufügen, wie "Klasse Impl implementiert Stack". – Tom

+0

In der Tat. Ich reagierte auf das, was ich im OP-Code sah. –

0

Sie müssen nur die interface Stack<T> generische Art der Schnittstelle angeben.

public interface Stack<T> { 

    void method1(T element); 

    T method2(); 
} 

Und Sie müssen auch die Gattung Sie class YourStack<T> Implementierung

class YourStack<T> implements Stack<T>{ 

    private List<T> elements; 

    @Override 
    public void method1(T element) { 
     elements.add(element); 
    } 

    @Override 
    public T method2() { 
     return elements.remove(elements.size() - 1); 
    } 
} 
+0

Beachten Sie, dass OPs-Schnittstelle bereits einen generischen Typ akzeptiert, aber aufgrund einer falschen Formatierung nicht angezeigt wurde. Ich denke, OP hat vergessen, den generischen Typ in seiner Klasse hinzuzufügen, wie 'Klasse YourStack implementiert Stack'. – Tom