Re: Using abstract class that implements interface
On Mon, 20 Apr 2009, Mike Schilling wrote:
Tom Anderson wrote:
(Am i right in thinking that if i expose an abstract class Foo to the
world, i can't subseqeuently make Foo an interface and keep binary
compatibility? Since all those invokevirtual bytcodes would need to
become invokespecial, i assume not.)
Simpler than that: a class C which extends Foo will fail to load if Foo
is an interface.
But what about classes which use Foo without extending it?
Say i start with this:
public abstract class Foo {
public abstract void method();
}
class FooImpl extends Foo {
public void method() {
System.out.println("running FooImpl.method");
}
}
public class FooClient {
public static void main(String... args) {
System.out.println("begun");
Foo foo = new FooImpl();
foo.method();
System.out.println("ended");
}
}
And then i change Foo and FooImpl to look like this:
public interface Foo {
public void method();
}
abstract class FooBase implements Foo {
public abstract void method();
}
class FooImpl extends FooBase {
public void method() {
System.out.println("running FooImpl.method");
}
}
*Without* recompiling FooClient?
The answer is that when i run FooClient, i get:
begun
Exception in thread "main" java.lang.IncompatibleClassChangeError
at FooClient.main(FooClient.java:6)
So FooClient loads okay, but the invocation of a method on a Foo fails,
because Foo was originally a class and is now an interface.
tom
--
wicked wicked jungle is massive i said wicked wicked jungle is massive
well big up cos this is the incredible genral -- fabien, sniffunsnuffun
town(scotland)