Groovy nadpisanie domyślen metody z Java

1

Witam,
mam interfejs

public interface Demo {
	public default int a() {
		return 0;
	}

	public default int b() {
		return a() + 1;
	};

i jego implementacje w Groovy

		GroovyShell groovyShell = new GroovyShell();
		Demo evaluate = (Demo) groovyShell.evaluate("[a:{->return 1;}] as hello.Demo");
		System.out.println(evaluate.a()); //0 a powinno być 1
		System.out.println(evaluate.b());  //1 a powinno być 2

jednak po mimo nadpisania metody a rezultat to dalej zero

0

Rzutujesz na Demo, więc wykonuje się domyślna metoda z interfejsu.

0

No ale w Java to Działa

public class DemoImlp implements Demo {

	@Override
	public int a() {
		return 1;
	}
}

  Demo evaluate = DemoImlp()
  System.out.println(evaluate.a()); //1
  System.out.println(evaluate.b());  //2
0

W kodzie powyżej to działa, ponieważ masz typ DemoImlp i nie rzutujesz tego na Demo. Z kolei w kodzie z pierwszego postu rzutujesz na Demo, więc wykonuje się metoda domyślna z interfejsu Demo.

0

NIe rzutuje DemoImlp na Demo bo nie ma potrzeby Elipse sam mi to usuwa

0
Szczery napisał(a):

NIe rzutuje DemoImlp na Demo bo nie ma potrzeby Elipse sam mi to usuwa

No właśnie rzutujesz, o to chodzi.

Demo evaluate = (Demo) groovyShell.evaluate("[a:{->return 1;}] as hello.Demo");
0

A jak usuniesz default i ciało metody to zadziała?

0

Chyba w tym rzecz (http://groovy-lang.org/objectorientation.html#_interface):

Groovy interfaces do not support default implementation like Java 8 interfaces. If you are looking for something similar (but not equal), traits are close to interfaces, but allow default implementation as well as other important features described in this manual.

1 użytkowników online, w tym zalogowanych: 0, gości: 1