2015-04-08 2 views
0

я обнаружил, что это работает :)Изменение значения объекта в ArrayList

Я нашел способ, чтобы заставить его работать. Вместо этого:

for(int i=0; i<alla.size(); i++){ 
    if(alla.get(i).getClass().getName().equals("Aktie")){ 
     alla.get(i).setKurs(0.0); 
    }   
} 

Я получил эту работу:

for(Värdesak v : alla){ 
    if(v instanceof Aktie){ 
     ((Aktie)v).setKurs(0.0); 
    } 
} 

Я не могу понять, что случилось с этим .. У меня есть ArrayList различных объектов, и у меня есть в моей программе, которая называется «крах фондового рынка», который должен установить все существующие курсы акций (не знаю, какое слово я ищу здесь) в моих архаристах до 0.0. не должно быть так alla.get (i) .setKurs (0.0);, когда я обнаружил один объект запаса в моем arraylist, если класс запаса (который является подклассом) имеет public void setKurs (double kurs) {this.kurs = kurs; }?

Я отправлю мой код здесь:

Это моя кнопка

class börsLyssna implements ActionListener{ 
    public void actionPerformed(ActionEvent ave){ 
     for(int i=0; i<alla.size(); i++){ 
      if(alla.get(i).getClass().getName().equals("Aktie")){ 
       alla.get(i).setKurs(0.0); 
      } 
     } 
    } 
} 

__

abstract class Värdesak{ 
private String namn; 


protected Värdesak(String namn){ 
    this.namn = namn; 

} 

public String getNamn(){ 
    return namn; 
} 


abstract public double getVärde(); 

public String toString(){ 
    return namn + ", "+ "värde: "+(getVärde()*1.25); 
} 
} 

class Aktie extends Värdesak{ 
private int antal; 
private double kurs; 

public Aktie(String namn, int antal, double kurs){ 
    super(namn); 
    this.antal = antal; 
    this.kurs = kurs; 
} 

public double getVärde(){ 
    return (antal*kurs); 
} 



public String toString(){ 
    return super.toString()+", antal: "+antal+" med en kurs på: "+kurs; 
} 

public void setKurs(double kurs) { 
    this.kurs = kurs; 
} 

public double getKurs() { 
    return kurs; 
} 

} 
+1

Вы проверили, что это 'if (alla.get (i) .getClass(). GetName(). Equals (" Aktie "))' возвращается true? – DigitalNinja

ответ

0

Я считаю, что метод (Class).getName() возвращает полное имя класса (в том числе пакет).

Например, из JDK 1.8 Docs, то getName() комментариев содержат этот пример:

String.class.getName() 
    returns "java.lang.String" 

Вы тестирование для имени класса без предисловия пакета иерархии.

+0

Я нашел способ заставить его работать. Вместо 'for (int i = 0; i

+0

Да, это более подходящий метод. Но использование 'instanceof' все еще может использоваться только в качестве последнего средства: вы по-прежнему упускаете полиморфный дизайн. –

0

Вместо

alla.get(i).getClass().getName().equals("Aktie") 

попробовать

alla.get(i) instanceof Aktie 

alla.get(i).getClass().getName() возвращает пакет и имя класса, например, java.lang.String вместо String.

0

Поскольку вы не показываете нам, как заполнено alla, мы не можем определить, есть ли в нем какие-либо Aktie. Есть много предлагаемых способов исправить это. Вот несколько кода отладки, которые позволят вам четко знать, где проблема и когда она исправлена.

class börsLyssna implements ActionListener{ 
    public void actionPerformed(ActionEvent ave){ 
     for(int i=0; i<alla.size(); i++){ 
      if(alla.get(i).getClass().getName().equals("Aktie")){ 
       System.out.println("Attempting to set kurs to 0.0 at i=" + i");//TODO remove debugging code 
       alla.get(i).setKurs(0.0); 
      } 
     } 
    } 
} 

Лично я думаю, что alla.get(i) instanceof Aktie будет исправить. Хотя я думаю, что ваша жизнь будет проще, если вы не поместите в коллекцию разные типы объектов. Было бы неплохо, если бы вы могли просто называть set() на все, что там было?

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