2015-10-06 243 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> 
相关问题