为什么从接口继承的调用方法必须进行强制转换?

时间:2019-06-24 08:03:30

标签: java inheritance casting

当我遇到无法理解的东西时,我正在练习用Java接口编程。我叫乡村课

 class Country implements Comparable
    {
    int a; 
    int b; 
    int c;
    public Country(int _a,int _b,int _c)
    {
    a=_a;
    b=_b;
    c=_c;
    }
    public int compareTo(Object obj)
    {
    /*compares a, b and c and returns number of variables greater for this object.I am not include instanceof check*/
    int count=0;
    Country other=(Country)other;
    if(a>other.a)
    count++;
    else 
    if(a<other.a)
    count--;
    if(b>other.b)
    count++;
    else 
    if(b<other.b)
    count--;
    if(c>other.c)
    count++;
    else 
    if(c<other.c)
    count--;
    return count;
    }
public void write()
{
System.out.println(" hello");
}
    public static void main(String args[])
    {
    Object p=new Country(1,2,3);
    Object q=new Country(2,3,4);
    System.out.println(p.compareTo(q));
    }
    }

所以这里的问题是,我们是否将某些内容声明为

Object p=new Country(1,2,3);
Object q=new Country(2,3,4); 
p.write(); 

这有效。 但是为什么不

p.compareTo(q)//as done in the main code

为什么需要此演员表?

((Comparable)p).compareTo(q);

2 个答案:

答案 0 :(得分:2)

因为您将值存储在类型为Object的引用中,所以,编译器无法知道它实际上是Country并且完全实现了Comparable

答案 1 :(得分:2)

这里:

Object p=new Country(1,2,3);

编译器可以知道p的类型为Country。但是它不知道。

它只会看到您声明p的类型为Object。并且Object类没有print()方法或compareTo()方法。

多态性(在对象的实际类型上查找方法)在运行时发生,但要确定某些对象是否具有在编译时会发生。并且在这种情况下,编译器决定:pObject,因此它缺少您要调用的方法!