2016-04-27 3 views
0

Я пытаюсь использовать Методы из класса, который у меня есть в списке Array.Использование методов из ArrayList Java

ArrayList - это ArrayList с устройством высшего класса.

ArrayList связывает объекты, расширяющие прибор, такие как часы и лампа.

когда я использую

arrayList.get (х), чтобы захватить объект в этой точке я не могу видеть методы, что объект имеет, я могу видеть только объекты суперкласса.

Пожалуйста, кто-нибудь может мне помочь.

Спасибо за чтение

кодекс (Некоторые из них)

public abstract class Appliance implements Serializable { 

    protected boolean power; 
    protected ImageIcon picture; 

    public Appliance() { 
    } 

    public void setPower(boolean power) { 
     this.power = power; 
    } 

    public boolean getPower() { 
     return power; 
    } 

    abstract ImageIcon getPicture(); 

    @Override 
    public String toString() { 

     String powerVal; 
     if (this.power == true) { 
      powerVal = "ON"; 
     } else { 
      powerVal = "OFF"; 
     } 

     return "Power: " + powerVal; 

    } 

} 



public class Clock extends Appliance { 

    private int hours; 
    private int minutes; 
    private int seconds; 

    public Clock() { 
     super(); 
     this.power = false; 
     this.picture = new ImageIcon("src/res/clock.jpg"); 
     this.hours = 23; 
     this.minutes = 59; 
     this.seconds = 59; 
    } 

    public Clock(boolean pow, int hours, int minutes, int seconds) { 
     super(); 
     this.power = pow; 
     this.picture = new ImageIcon("src/res/clock.jpg"); 
     this.hours = hours; 
     this.minutes = minutes; 
     this.seconds = seconds; 
    } 

    public int getHour() { 
     return this.hours; 
    } 

    public void setHours(int hours) { 
     this.hours = hours; 
    } 

    public int getMinutes() { 
     return this.minutes; 
    } 

    public void setMinutes(int minutes) { 
     this.minutes = minutes; 
    } 

    public int getSeconds() { 
     return this.seconds; 
    } 

    public void setSeconds(int seconds) { 
     this.seconds = seconds; 
    } 

    @Override 
    public ImageIcon getPicture() { 
     return this.picture; 
    } 

    @Override 
    public String toString(){ 
     return super.toString() + String.format(" and the time is %d:%d:%d",this.hours, this.minutes, this.seconds); 
    } 

} 

public class Lamp extends Appliance{ 


    //Default constructor or Empty argument constructor 
    public Lamp(){ 
     super(); 
     this.power = false; 
     this.picture = new ImageIcon("src/res/lamp.jpg"); 
    } 
    public Lamp(boolean pow){ 
     super(); 
     this.power = pow; 
     this.picture = new ImageIcon("src/res/lamp.jpg"); 
    } 
    @Override 
    ImageIcon getPicture() {  
     return picture; 
    }  

    @Override 
    public String toString(){ 
     return super.toString(); 
    } 
} 



public class Controller { 

private ArrayList<Appliance> myAppliances = new ArrayList<>(); 
private JLabel[] labelArray; 

................................................... 


    @Override 
    public void mouseClicked(MouseEvent me) { 

     String[] options = new String[]{"yes","no"}; 

     if (me.getButton() == 1){ 
      try{ 

      int x = Integer.parseInt(me.getComponent().getName()); 

      Appliance myApp = this.myAppliances.get(x); 

      if(myApp.getClass().equals(Clock.class)){ 

       JOptionPane.showOptionDialog(null, "Clock Info: /nTime: " + myApp., "Clock", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null,options,options[1]); 
      } 

      } catch (Exception e){ 
       System.out.println("Null Poiter"); 
      } 

     } 

    } 

} 


Its the myApp. part in the clicked method 
+0

Можете ли вы показать пример кода? – Austin

ответ

2

Я предполагаю, что вы делаете что-то вроде этого (извините, но это не ясно из Вашего вопроса):

ArrayList<SuperClass> al; 
...populated with instances of Appliance 

al.get(1).getClock(); //Compile error. 

Проблема в том, что java не знает, является ли ваш элемент в этой позиции SuperClass, Appliance или чем-то еще, что наследуется от SuperClass. Вы можете привести код, чтобы заставить его вести себя так, как вы хотите:

((Appliance)al.get(1)).getClock(); 

Вы также можете использовать оператор instanceOf, чтобы убедиться, что у вас есть экземпляр класса, который вы ожидаете.

+1

Кто-то grouchy отклонил наши ответы. – DavidS

+0

Спасибо, я исправил его с помощью cast ((Clock) myApp) .getHours – LittleFallenOne

+1

Они всегда делают @DavidS. –

0

Это звучит, как вы пишете

List<Appliance> appliances = new ArrayList<>(); 
appliances.add(new Lamp()); 
appliances.add(new Clock()); 

Appliance appliance = appliances.get(0); 
appliance.setAlarm(TOMORROW); 

Я думаю, что из этого примера, вы можете понять, почему вы не можете получить доступ к методам подкласса. Когда у вас есть список Appliance, вы не знаете, являются ли объекты в нем часами или лампами, поэтому, когда вы получаете один из них, вы не можете вызвать методы подкласса.

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

Clock clock = (Clock) appliances.get(1); 
clock.setAlarm(TOMORROW); 

Но это не Java Путь. Как правило, вы используете только методы суперкласса на Appliance или поддерживаете отдельный список для часов и ламп.

+0

Я только делал это так, как это было так, как мой краткий рассказывал мне об этом – LittleFallenOne

0
 ArrayList<Appliance> mylist = new ArrayList(); 
    for(Appliance app : mylist){ 

    boolean isAclock = app instanceof Clock; 
    boolean isALamp = app instanceof Lame; 

     if(isAlamp){ 
     Lamp l = (Lamp)app; 
     }else{ 
     Clock c = (Clock)app; 
     } 

    } 

, в результате чего ваш арралист может принять appliacnces, будет принимать свои подкласс. Проблема заключается в получении правильного объекта класса. вы можете использовать экземпляр и проверить тип объекта, а затем применить объект к его исходному типу попробуйте использовать этот подход

0

Это ожидаемое поведение. Так работает полиморфизм.

Давайте рассмотрим пример, используя ваши собственные классы. Представьте, что вы держите мешок. Вы знаете, что в эту сумку могут войти только Appliance объектов, поэтому вы можете обойти всю технику в своем доме в эту сумку - ваш Lamp, ваш Clock, может быть, ваш Toaster и Blender, а также множество других.

Теперь представьте, что вы надеваете повязку и случайно вытаскиваете одну из приборов. Не смотря на это, как вы можете сказать, что это такое? Вы не можете! Если вы предполагаете, что вещь, которую вы только что вытащили, была Toaster, и вы попытались сделать свой хлеб с этим, что бы произошло, если бы вы на самом деле держали Blender? Вероятно, у вас будет кровавый беспорядок. Поэтому единственное, что вы знаете по факту, что все объекты Appliance могут делать, это turnOn() или turnOff(), так что это единственные доступные вам методы.

В этом примере вы являетесь компилятором, а сумка - это список. Если вы сообщите компилятору, что в списке могут содержаться только объекты Appliance, он не будет принимать ничего другого в отношении объектов в списке , если вы явно не укажете его (например, если вы опустили объект Appliance на Toaster, выполнив что-то ((Toaster)applianceList.get(0)).toast()).

Смежные вопросы