2013-08-22 100 views
-2

为什么java不允许继承类型作为overriden方法的参数?为什么java不允许继承类型作为重写方法的参数?

例如我有Graph类和矢量类继承自元素class.Now我有另一个类放类我在哪里有一个方法像元素操作(元素e).. 现在,如果我有putGraph类和putVector类继承自put类和两个类,例如在图类中,如果我重写操作()方法就像这个图操作(图g)它显示的错误。为什么是这样?对不起,对于冗长的描述

+1

小心给我们看一些代码? – StormeHawke

+0

你有Graph和Vector作为Element的子类,putGraph和putVector是Put类的子类吗?是对的吗? – Kon

+0

代码在哪里,错误是什么? – GriffeyDog

回答

1

我假设你的代码是这样的?

class Element { 
    public Element manipulate(Element e) { ... } 
} 

class Graph extends Element { 
    @Override 
    public Graph manipulate(Graph g) { ... } 
} 

这会给你一个错误。我认为它不能被允许的理由是这样的:

Graph g1; 
Element e1 = g1; 
Vector v1;   // another subclass of Element 
Element e2 = e1.manipulate(v1); 

e1被声明为Element,所以编译器将允许e1.manipulate(v1)因为v1也是Element(实际上属于一个子类,这是OK) 。编译器在编译时不知道e1实际上是Graph。但是当你运行它时,由于e1在运行时的实际类型是Graph,Graph类中的manipulate方法被称为(多态),但参数gVector而不是Graph,如参数g所述,它应该是是。那么该计划应该做什么?

如果上面真的是你想要的,你需要像

class Graph extends Element { 
    @Override 
    public Graph manipulate(Element e) { // it's OK to change the *return* type, 
              // in later versions of Java 
     if (e instanceof Graph) { 
      Graph g = (Graph)e; 
      // now you can work with g 
     } else 
      throw new SomeException(); // or return null, or whatever is 
             // appropriate 
    } 

} 

不知道,如果你的问题是像这样的东西,因为我还没有看到任何的代码呢。

相关问题