Java OCAJP7: stesso campo ereditato sia da una superclasse che da un’interfaccia implementata

Cosa succede se una classe estende una classe base che possiede una variabile di istanza ed allo stesso tempo implementa un’interfaccia in cui è definito un membro con lo stesso nome?
Non succede nulla se non cerco di accedere a quella variabile:

interface MyInterface {
    public static int x = 0;
}

class SuperClass {

    protected int x = 10;

}

public class VarInheritanceTest extends SuperClass implements MyInterface{

    public static void main(String[] args) {

        System.out.println("OK!");
    }
}
OK!

Quando invece cerco di accedere alla variabile possono verificarsi dei problemi. Se si cerca ci accedere alla variabile direttamente con il suo nome si ottiene un errore di compilazione, che segnala l’ambiguità del tentativo di accesso che si sta effettuando:

interface MyInterface {
    public static int x = 0;
}

class SuperClass {

    protected int x = 10;
}

public class VarInheritanceTest extends SuperClass implements MyInterface{

    public static void main(String[] args) {

        System.out.println("Value: " + x);
    }
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The field x is ambiguous

	at net.davismol.ocpjp7.VarInheritanceTest.main(VarInheritanceTest.java:18)

Se si vuole accedere al valore del campo “x” definito nell’interfaccia occorre indicarlo esplicitamente:

interface MyInterface {
    public static int x = 0;
}

class SuperClass {

    protected int x = 10;

}

public class VarInheritanceTest extends SuperClass implements MyInterface{

    public static void main(String[] args) {

        System.out.println("Value: " + MyInterface.x);

    }
}

In questo caso otteniamo:

Value: 0

La variabile definita nella classe SuperClass in questo caso non è statica per cui, per accedere ad essa, occorre creare un’istanza della classe. Anche creando un’istanza della classe però, l’accesso diretto tramite il nome della variabile resta ambiguo.

interface MyInterface {
    public static int x = 0;
}

class SuperClass {

    protected int x = 10;

}

public class VarInheritanceTest extends SuperClass implements MyInterface{

    public static void main(String[] args) {

        VarInheritanceTest vit = new VarInheritanceTest();
        System.out.println("Value: " + vit.x);

    }
}

Per indicare a quale dei due valori si vuole accedere occorre effettuare un cast esplicito dell’oggetto alla classe base o all’interfaccia. Nei due esempi seguenti vediamo come, a seconda del cast esplicito che indichiamo, venga stampato il relativo valore del campo “x”.

interface MyInterface {
    public static int x = 0;
}

class SuperClass {

    protected int x = 10;

}

public class VarInheritanceTest extends SuperClass implements MyInterface{

    public static void main(String[] args) {

        VarInheritanceTest vit = new VarInheritanceTest();
        System.out.println("Value: " + ((SuperClass)vit).x);

    }
}
Value: 10
interface MyInterface {
    public static int x = 0;
}

class SuperClass {

    protected int x = 10;

}

public class VarInheritanceTest extends SuperClass implements MyInterface{

    public static void main(String[] args) {

        VarInheritanceTest vit = new VarInheritanceTest();
        System.out.println("Value: " + ((MyInterface)vit).x);
    }
}
Value: 0
This entry was posted in $1$s. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *