Re: Object orientation question
On 10/28/2014 5:45 AM, Andreas Leitgeb wrote:
Robert Klemme <shortcutter@googlemail.com> wrote:
On 27.10.2014 21:51, Eric Sosman wrote:
Clearly, the generated code is the same: AdditionInterface extends
BaseInterface, therefore any class implementing AdditionInterface also
necessarily implements BaseInterface. If the class fails to provide a
method specified by BaseInterface, the code won't compile. So the
question is purely about readability and style.
This is not fully correct: if you check with reflection you will see
that there is a difference in what Class.getInterfaces() returns.
You don't even need reflection to notice a difference:
interface A { ... } | interface A { ... }
interface B { ... } | interface B extends A { ... }
class C implements A,B { ... } | class C implements B { ... }
... | ...
B foo = new C(); | B foo = new C();
A bar = foo; // barf! | A bar = foo; // ok
Instead of the second assignment you could have a call to a
method that takes an A and gets passed B-typed reference foo.
My Java compiler (Oracle's 1.8.0_20 on 64-bit Windows 7)
doesn't "barf" as you report. Has something changed? Are you
using a different javac? Here's the code; I've fleshed out
the ellipses and changed one name:
interface A {
void aMethod();
}
interface B extends A {
void bMethod();
}
class C implements A, B {
public void aMethod() {
}
public void bMethod() {
}
void foo() {
B foo = new C();
A bar = foo; // fine
}
}
class D implements B {
public void aMethod() {
}
public void bMethod() {
}
void foo() {
B foo = new D();
A bar = foo; // fine, no "barf"
}
}
I put all this in a file called "Andreas.java", ran javac on it,
and got four class files and no complaints.
--
esosman@comcast-dot-net.invalid