Создание массива разных объектов

212
11 февраля 2018, 00:11

Есть два интерфейса

public interface Creep {
    void creep();
}  
public interface Wriggle extends Creep {
    void wriggle();
}

И 3 класса

public class Creature {
    public void whoAmI(){
        System.out.print("I'am Creature -");
    }
}
public class Dog extends Creature implements Creep {
    @Override
    public void creep(){
        System.out.println("Creep from Dog");
    };
}
public class Snake extends Creature implements Wriggle {
    public void wriggle(){
        System.out.println("wriggle from Snake");
    }
    public void creep(){
        System.out.println("creep from Snake");
    }
}

Хочу создать массив состоящий из классов Dog, Snake. Как это правильно реализовать? Сделал следующее:

List<Creep> list = new ArrayList<Creep>();
list.add(new Snake());
list.add(new Dog());
list.get(0).creep();
list.get(0).wriggle();

Но на вызове wriggle() получаю ошибку компиляции, что этого метода нет, как тогда можно реализовать массив для этих объектов?

Answer 1

Дело в Generic. Так как вы указали List<Creep> list с типом Creep, то у вас get и вернул Creep. (Это возможно за счет того, что в Java можно делать так: Creep c = new Snake();)

На самом деле внутри листа будет лежать просто Object, а тип который вы указываете в <> доступен лишь во время компиляции.

Если вы хотите получить объект правильного типа, нужно сделать так:

((Snake) list.get(0)).wriggle();

Но учтите, что восходящие преобразования - это плохо и их по возможности следует избегать.

READ ALSO
К каким типам данных (потокам) необходимо координировать многопоточный доступ?

К каким типам данных (потокам) необходимо координировать многопоточный доступ?

Есть переменные экземпляра, переменные класса, локальные переменные, литералы, ссылочные типы, примитивные типы

204
Зачем нужны разные типы ссылок в Java?

Зачем нужны разные типы ссылок в Java?

Углубляю познания о джавеНаткнулся на статью о типах ссылок

251
OutputStream sound

OutputStream sound

В моём приложении на андроид я использую несколько звуков с помощью класса soundpool,теперь я хочу реализовать функцию записи звука внутри своего...

191
Мапинг на кастомные типы в SQL и Java

Мапинг на кастомные типы в SQL и Java

Имеется довольно простой класс:

203