2015-05-28 43 views
0
package java; 

public class Question { 

    interface A {} 

    class B0 implements A {} 

    static void f(B0 b) {} 

    public static void main(String[] args) { 

     A a = new B0(); 
     B0 b = new B0(); 

     Question.f(a); // compiler error 
     Question.f(b); 

    } 

} 

这是编译器的错误规则不同。 A)Question.java/java/src/java line 18 Java问题Java函数匹配从C++

在C++中,这可以工作,a的运行时类型是B0,所以Question.f是匹配的。

为什么Java会使这个错误?

+0

这工作在C++中的几种口味的工作? – chris

+2

这不会在C++中编译。 'a'不是'B0'。 'a'是'A'。 – Barry

+0

即使使用C++编译,您认为Java是否相同? – deviantfan

回答

2

由于B0是A的专门化,因此A可能具有比B0更少的功能。

f要求B0。 f可以合理地期望访问A中不存在的方法或成员。如果这用C++编译,编译器就会中断。

在C++中的等效是

class A 
{ 

}; 

class B0: public A 
{ 

}; 

static void f(B0 * b) 
{ 

} 

int main() { 

    A * a = new B0(); 
    B0 * b = new B0(); 

    f(a); // compiler error 
    f(b); 

    delete a; 
    delete b; 
} 

这并不在GCC 4或MSVS 10

+0

是的,这在Java或C++中不起作用。在某些情况下,我认为Java的行为与C++不同,但事实并非如此。 – silvermangb