Re: multiple inheritance in Java
On 7/3/2013 8:01 AM, lipska the kat wrote:
On 03/07/13 10:46, Steven Simpson wrote:
On 02/07/13 19:53, Lew wrote:
WIth Java 8 don't we get default methods? You can multiply-inherit
interfaces.
I don't see how default methods help here. You might define Position as
an interface:
interface Position {
int getX();
int getY();
void setX(int x);
void setY(int y);
}
...but what default implementations can you give any of these methods
without adding some state to Position?
This is an interesting question
It is possible to add state to an interface so that it is *almost* a class
The following compiles and runs on 64 bit Ubuntu Linux with
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b96)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b38, mixed mode)
javac 1.8.0-ea
I haven't figured out all the mechanics or ramifications of this yet but
it certainly looks like it is effectively possible to implement a form
of multiple inheritance in Java. Not exactly an edifying prospect.
=============================================================
/* public instance variables for brevity */
class State{
public Integer a = 0;
public Integer b = 0;
}
interface Foo{
/* explicitly static and final */
Integer i = 0;
State state = new State(); /* final reference, mutable instance */
default public void doFoo(Integer x){
//i = 10; /* illegal */
Integer y = x + i;
state.a = y + y;
System.out.println("doingFoo, i + x is " + y);
System.out.println("doingFoo, accessing state state.a is " +
state.a);
}
}
interface Bar{
Integer i = 0;
State state = new State();
default public void doBar(Integer x){
Integer y = x + i;
state.a = y + y;
System.out.println("doingBar, i + x is " + y);
System.out.println("doingBar, accessing state state.a is " +
state.a);
}
}
/* who owns the state? */
class FooBarImpl implements Foo, Bar{
}
public class Test{
public static void main(String[] args){
FooBarImpl fbi = new FooBarImpl();
fbi.doFoo(5);
fbi.doBar(10);
}
}
Foo own its state and Bar own its state and FooBarImpl
owns nothing.
Slightly different example:
public class StateTest {
public static void main(String[] args) {
System.out.println(Foo.state);
System.out.println(Bar.state);
FooBarImpl o = new FooBarImpl();
o.doFoo();
o.doBar();
}
}
interface Foo {
int state = 123;
public default void doFoo() {
System.out.println(Foo.state);
System.out.println(Bar.state);
System.out.println(state);
}
}
interface Bar {
int state = 456;
public default void doBar() {
System.out.println(Foo.state);
System.out.println(Bar.state);
System.out.println(state);
}
}
class FooBarImpl implements Foo, Bar {
public void m() {
System.out.println(Foo.state);
System.out.println(Bar.state);
// does not compile because state is ambiguous:
//System.out.println(state);
}
}
Arne