2015-05-28 73 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