Rzut niczym podejście 2
Post o rzutowaniu nulla trafił na Java Killers. Paweł będzie zapewne wdzięczy na temat następnego killersa. Po kolei jednak.
Jak wiadomo kompilator jak i JVM ma swoje preferencje przy wyborze metody, która zostanie wywołana. Pytanie co jeżeli mamy dwie metody pierwsza przyjmująca interfejs, a druga przyjmująca konkretną klasę implementującą ten interfejs. Która metoda zostanie wywołana? Przykładowy program poniżej:
Listing 1.
package eu.runelord.blog;
public class App2 {
public static void main(String[] args) {
I1 i1a = new A();
I1 i1b = new B();
I1 i1c = new C();
A a = new A();
B b = new B();
C c = new C();
I2 i2c = new C();
m(i1a);
m(i1b);
m(i1c);
m(a);
m(b);
m(c);
m(i2c);
}
public static void m(I1 i) {
System.out.println("I1");
}
public static void m(I2 i) {
System.out.println("I2");
}
public static void m(A a) {
System.out.println("A");
}
public static void m(B b) {
System.out.println("B");
}
public static void m(C c) {
System.out.println("C");
}
}
interface I1 {}
interface I2 {}
class A implements I1 {}
class B implements I1 {}
class C implements I1, I2 {}
W tym przypadku wracamy do punktu 2. Program się nie skompiluje ponieważ kompilator nie będzie wiedział czy wywołać metodę „po klasie” czy „po interfejsie”. Oczywiście rzutowanie rozwiązuje ten problem.
To na tyle dzisiaj.
Kod jest dostępny na licencji MIT. Jednak niektóre rozwiązania mogą być objęte inną licencją. W takim przypadku jest, to zaznaczone. Artykuły są dostępne na licencji CC-BY.
Jeżeli spodobał ci się ten wpis, to podziel się nim z innymi lub wesprzyj autora.