Tengo dos interfaces:

interface S {
    public String m1();
}

interface O {
    public Object m1();
}

Decido implementar O y S en una prueba de clase:

class Test implements O, S {

}

Mi pregunta :

¿Por qué solo debo implementar el método public String m1() y no el otro? Y en segundo lugar, ¿por qué no puedo implementar public Object m1() en lugar de public String m1()?

5
Spn 8 sep. 2018 a las 22:40

3 respuestas

La mejor respuesta

Java le permite usar tipos de retorno covariante para anular métodos.

Esto significa que un método de anulación puede devolver un subtipo del tipo declarado en el método anulado.

En este caso, String es covariante con Object; como todos los String s también son Object s, es un tipo de retorno adecuado para implementar O.m1() y O.m2().

Pero no puede tener dos métodos con la misma firma en una sola clase (el tipo de retorno no es parte de la firma). Por lo tanto, solo puede implementar como máximo 1, cuando los tipos de retorno son compatibles, como aquí. (Y si no son compatibles, obtendrás un error de compilación).

8
Andy Turner 8 sep. 2018 a las 19:54

String es una instancia de la clase Object. Entonces, cuando está implementando el método de interfaz, puede cambiar la conversión de tipo. Solo el tipo primitivo como int,double..and others no puede escribir la conversión.

0
drowny 8 sep. 2018 a las 19:53

Puedes usar esto

class Test implements O, S {

    O  _o = new O() {
              @Override
              public Object m1(){
                return new Object();
              }
           };

    @Override
    public String m1(){
      return "";
    }
}

Test t = new Test();
t.m1();// m1 from s
t._o.m1();// m1 from O
0
Bahman 8 sep. 2018 a las 20:07