Query regarding java Multiple Inheritance

A

Amit Jain

Hi All,
I am new to Java and need your views for my query.

What will be the solution for implementint two Interface in a single
class A if these interfaces I1 and I2 are written as mentioned below:
interface I1{
void method ();
long square(long i);
}

interface I2{
String method();
long squareRoot(long i);
}

class A implements I1, I2{
void method(){
System.out.println("--- Hi ----");
}
// implementation of square() and squareRoot() method
}

Above implementation of interface in class A will never complies
because of "void method();" declared in both I1 and I2. And we want
the implementation of I1 and I2 in class A only. How can we acheive
this in such situations.

regards,
Amit J.
 
L

Lew

Amit said:
Hi All,
I am new to Java and need your views for my query.

What will be the solution for implementint two Interface in a single
class A if these interfaces I1 and I2 are written as mentioned below:
interface I1{
void method ();
long square(long i);
}

interface I2{
String method();
long squareRoot(long i);
}

class A implements I1, I2{
void method(){
System.out.println("--- Hi ----");
}
// implementation of square() and squareRoot() method
}

Above implementation of interface in class A will never complies
because of "void method();" declared in both I1 and I2.

That is not a correct statement. 'void method()' is only declared in 'I1'.
And we want the implementation of I1 and I2 in class A only.
How can we acheive this in such situations.

Your problem is that 'method()' has incompatible return types in the two
interfaces, otherwise 'A' could happily implement both.

An interface is a declaration of type. As such, it makes promises about the
public face of any implementation. A class can satisfy the promises of any
number of interfaces as long as those promises don't contradict each other.

In your example, the promise made by 'I1' for 'method()' to return 'void'
contradicts the promise in 'I2' to return 'String'. No way an implementation
can keep both promises for the same-named method.

To do what you want, you're either going to have to give the 'method()' method
compatible return types in both interfaces, or change its name in at least one
of them.

<http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.5>
<http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.8>
 
A

Arne Vajhøj

Amit said:
Hi All,
I am new to Java and need your views for my query.

What will be the solution for implementint two Interface in a single
class A if these interfaces I1 and I2 are written as mentioned below:
interface I1{
void method ();
long square(long i);
}

interface I2{
String method();
long squareRoot(long i);
}

class A implements I1, I2{
void method(){
System.out.println("--- Hi ----");
}
// implementation of square() and squareRoot() method
}

Above implementation of interface in class A will never complies
because of "void method();" declared in both I1 and I2. And we want
the implementation of I1 and I2 in class A only. How can we acheive
this in such situations.

Java does not allow this construct. You need a workaround.

I once created the example below to illustrate a
possible workaround which I believe is a reasonable good
one.

Arne

========================

public class MultiInterf {
public static void main(String[] args) {
A o = new A();
System.out.println(o.asB().f());
System.out.println(o.asC().f());
}
}

interface B {
Object f();
}

interface C {
boolean f();
}

class A {
public Object fB() {
return null;
}
public boolean fC() {
return false;
}
public B asB() {
return new AB(this);
}
public C asC() {
return new AC(this);
}
private static class AB implements B {
private A real;
public AB(A real) {
this.real = real;
}
public Object f() {
return real.fB();
}
}
private static class AC implements C {
private A real;
public AC(A real) {
this.real = real;
}
public boolean f() {
return real.fC();
}
}
}
 
J

John B. Matthews

Amit Jain said:
I am new to Java and need your views for my query.

What will be the solution for implementint two Interface in a single
class A if these interfaces I1 and I2 are written as mentioned below:
interface I1{
void method ();
long square(long i);
}

interface I2{
String method();
long squareRoot(long i);
}

class A implements I1, I2{
void method(){
System.out.println("--- Hi ----");
}
// implementation of square() and squareRoot() method
}

Above implementation of interface in class A will never complies
because of "void method();" declared in both I1 and I2. And we want
the implementation of I1 and I2 in class A only. How can we acheive
this in such situations.

If the two methods named "method" are actually the same, derive A from
an abstract class that implements I1 & I2. See "When an Abstract Class
Implements an Interface":

<http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html>

For example,

public class AbstractInterface {

public static void main(String[] args) {
A a = new A();
System.out.println(a.method());
System.out.println(a.square(2));
System.out.println(a.cube(2));
}

interface I1 {
long square(long i);
}

interface I2 {
long cube(long i);
}

private static abstract class X implements I1, I2 {
public String method() {
return "Hi!";
}
}

private static class A extends X {

@Override
public long square(long i) { return i * i; }

@Override
public long cube(long i) { return i * i * i; }
}
}
 
S

Sarkar

Thanks all for valuable inputs. Now things are more clear to me.

Thanks once again

regards, Amit J.
 
J

John B. Matthews

Arne Vajhøj said:
They are not - they return different type.

Indeed, I was puzzled by the contradiction between the OP's statement
'"void method();" declared in both I1 and I2' and the divergent return
types you mention. My suggestion was intended to address the former
interpretation; your class MultiInterf addresses the latter.

I appreciate the OP responding, but I would enjoy hearing more about the
resolution.
 
R

Roedy Green

Above implementation of interface in class A will never complies
because of "void method();" declared in both I1 and I2. And we want
the implementation of I1 and I2 in class A only. How can we acheive
this in such situations.

In Java, you can't have two methods that differ only in return type.
There is no Eiffelian rename technique to resolve such conflicts. You
have to manually rename the method in one of your interfaces.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top