2015-10-06 56 views
1

我的類KTree正在擴展抽象類GraphClass,但GraphClass中定義的方法之一不能被重寫。方法不會從抽象超類重寫


public abstract class GraphClass<V extends VertexInterface<?> ,E extends EdgeInterFace <V,?>> implements UndirectedGraph<V,E>{ 
//other methods 

    @Override 
    public boolean addEdge(E e, V v, V v1) { 
     return false; 
    } 

//more methods 
} 

原始方法addEdge(E e, V v, V v1)是在KTreeaddEdge(E e, V v, V v1)接口UndirectedGraph<V,E>


public class KTree<V extends VertexInterface<?> ,E extends EdgeInterFace <V,?>> extends GraphClass { 
//other methods 

    @Override 
    public boolean addEdge(E e, V v, V v1) { 

     if(!this.Nodes.contains(v) || !this.Nodes.contains(v1) || this.Edges.containsValue(e)){ 
      return false; 
     } 

     v.setDegree(v.getDegree()+1); 
     v1.setDegree(v1.getDegree()+1); 

     this.Edges.put(e.getHashCode(),e); 

     return true; 
    } 

//more methods 
} 

定義引發錯誤

'addEdge(E,V,V)' 在 'KTree' 與 'addEdge(E,V,V)' 中 'GraphClass' 衝突;這兩種方法具有相同的擦除,但既沒有覆蓋 的其他

KTree的@override引發錯誤

方法不自其超

覆蓋

我明白爲什麼他們有相同類型的擦除,但我認爲如果我添加@override它將默認爲所有KTree實例的該版本的方法。我想要做的只是重寫GraphClass中的方法,但不知道爲什麼它不能識別@override。這是否與覆蓋已覆蓋接口方法的方法有關?

回答

3

的問題是因爲在KTree定義的EV不一樣GraphClass定義的值。基本上,你繼承了GraphClass的原始形式。將您的KTree的聲明更改爲:

public class KTree<V extends VertexInterface<?>, E extends EdgeInterFace <V, ?>> extends GraphClass<V, E> 

它應該可以工作。

2

我認爲這是因爲您在KTree聲明中以原始形式使用了GraphClass(沒有類型參數)。

它應該是:

public class KTree<V extends VertexInterface<?> ,E extends EdgeInterFace <V,?>> extends GraphClass<V, E> 
相關問題