Есть два интерфейса
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() получаю ошибку компиляции, что этого метода нет, как тогда можно реализовать массив для этих объектов?
Дело в Generic. Так как вы указали List<Creep> list с типом Creep, то у вас get и вернул Creep. (Это возможно за счет того, что в Java можно делать так: Creep c = new Snake();)
На самом деле внутри листа будет лежать просто Object, а тип который вы указываете в <> доступен лишь во время компиляции.
Если вы хотите получить объект правильного типа, нужно сделать так:
((Snake) list.get(0)).wriggle();
Но учтите, что восходящие преобразования - это плохо и их по возможности следует избегать.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей