While answering to Larry Luther in a long thread in D.learn:
http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=19913

I have found an interesting difference that I didn't know between Java and D. 
Here I have reduced the test cases:


// Java code
class A {
    void foo(A a) {}
}
class B extends A {
    void foo(B b) {}

    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        b.foo(a);
    }
}



// D2 code
class A {
    void foo(A a) {}
}
class B : A {
    void foo(B b) {}
}
void main() {
    A a = new A;
    B b = new B;
    b.foo(a);// comment this out and use warnings
}


If you comment out the last line in the D2 code, and you use warnings, DMD 
tells you at compile time:

test.d(5): Error: class test.B test.A.foo(A a) is hidden by B


If you uncomment that line DMD shows:

test.d(12): Error: function test.B.foo (B b) is not callable using argument 
types (A)
test.d(12): Error: cannot implicitly convert expression (a) of type test.A to 
test.B


While the Java code compiles and runs with no errors.
It seems in D the B.foo() hides A.foo() even if there is no overriding at all 
here.

The presence of that warning tells me this is not an implementation bug, D is 
designed this way on purpose. But what is the rationale behind this difference 
(that at best will puzzle Java programmers trying to use D)?

Bye,
bearophile

Reply via email to