Доступ к переменным-членам интерфейса по-разному с разными результатами

Во время игры с лямбдами для Java 8. Я заметил интересное поведение при попытке доступа к переменной члена интерфейса тремя способами.

import java.util.*;
public interface Pet {
    String kind ="Pet";
    default void interact() { System.out.println(String.format("Wanna buy a %s", this.kind)); }
}

class Frog implements Pet {
    public String kind ="Frog";
    public void interact() { System.out.println(this.kind); }
}

class Rat implements Pet {
    public String kind ="Rat";
    public void interact() { System.out.println(this.kind); }
}



public class InternalIteration {

    public static void main(String[] args) {
        List<Pet> pets = Arrays.asList(new Rat(), new Frog());

        System.out.println("Speak method output:");
        pets.forEach((Pet p)->{
            p.interact();
        });

        System.out.println("Un-casted class kind member variable:");
        pets.forEach((Pet p)->{
            System.out.println(p.kind);
        });

        System.out.println("Casted class kind member variable:");
        System.out.println(((Rat)pets.get(0)).kind);
        System.out.println(((Frog)pets.get(1)).kind);
    }
}

Запуск этого кода дает следующий результат:

Speak method output:
Rat
Frog
Un-casted class kind attribute:
Pet
Pet
Casted class kind attribute:
Rat
Frog

Кажется, что при доступе к переменной через реализации interact Метод, к которому осуществляется доступ к переменной - это метод в классе реализации. Однако при доступе к публичной переменной напрямую возвращается переменная члена интерфейса. Доступ к нему непосредственно после приведения, похоже, снова возвращает переменную реализации.

Это выглядит сбивающим с толку, если не противоречит мне, так как доступ к interact метод и kind Открытая переменная возвращает разные результаты даже при работе с одним и тем же объектом.

0 ответов

Другие вопросы по тегам