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.

2 myśli na temat “Rzut niczym podejście 2

  1. Podany kod kompiluje się w najlepsze.
    W celu pokazania problemu (który autor nieprecyzyjnie opisał), należy usunąć metodę void m(C c).

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax