2013-08-12 3 views
0

У меня есть список Arraylist1 (банан, апельсин ...), и у меня есть классный плод. Я хочу создать список Arraylist2, элементами которого являются экземпляры фруктов, а имена экземпляров - это элементы списка1. я сделал все натуры с тем же именем, но мне нужно определенное имя для каждого экземпляра. возможно ли это в java? я попытался это, но он не работает для меняСоздайте Arraylist классов

public class list { 
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
     ArrayList<String> list1=new ArrayList<>(); 
     ArrayList<Fruit> list2=new ArrayList<>(); 
     list1.add("banana"); 
     list1.add("Orange"); 
     list1.add("strawberry"); 
     for (int i = 0; i < list1.size(); i++) { 
      String className=list1.get(i); 
      Class<?> clazz = Class.forName(className); 
      Object obj = clazz.newInstance(); 
      list2.add((Fruit) obj); 
     } 
    } 
} 


public class Fruit { 
    int price; 
    String color; 

    public Fruit() { 
    } 

    public int getPrice() { 
     return price; 
    } 

    public String getColor() { 
     return color; 
    } 

    public void setPrice(int price) { 
     this.price = price; 
    } 

    public void setColor(String color) { 
     this.color = color; 
    } 

} 

enter image description here

+0

Почему вы не используете 'new Fruit()' для создания ваших фруктов? У вас есть некоторые ограничения? Можете ли вы показать нам свой класс «Фрукты»? –

+0

@ArnaudDenoyelle это сделано – Mikou

+0

Вы должны использовать 'Map ', чтобы держать ваши данные бакалеи. –

ответ

0

Во-первых, это изменить: ArrayList<Fruit> list2=new ArrayList<>(); к этому:

ArrayList<? extends Fruit> list2=new ArrayList<? extends Fruit>();

Тогда попробуйте это:

Class<?> clazz = Class.forName(className); 
Fruit obj = (Fruit)clazz.newInstance(); 
list2.add(obj); 
+0

Почему вы советуете изменять '' в ' '? – dantuch

0

Почему бы не сделать это:

ArrayList<String> list1 = new ArrayList<String>(); 
ArrayList<Fruit> list2 = new ArrayList<Fruit>(); 
list2.add(new Bannana()); 
list2.add(new Orange()); 
list2.add(new Strawberry()); 
for (int i = 0; i < list2.size(); i++) { 
    String className=list2.get(i).getClass().getSimpleName(); 
    list1.add(className); 
} 

Создать класс, а затем получить имя класса для заполнения массива имен.

Что я рекомендую больше, чем это было бы, чтобы создать класс фруктов, который имел геттеры и сеттеры для имен фруктов. Что-то вроде ...

public class Fruit{ 
    private String name; 
    //other stuff... nutrition maybe? 
    public String getName(){return this.name;} 
    public void setName(String name){this.name = name;} 
} 

Связать имя с вашим классом фруктов.

+0

wiliam мой класс имеет alrady имя атрибута, но когда я хочу получить данные, его проще написать list2.get (indexof (orange)), чем поиск по атрибуту name – Mikou

+1

Хорошо, почему бы не создать хешмап, отображающий имя фрукта для фруктов ? 'HashMap '? –

+0

хорошая идея, я подумаю об этом;) спасибо – Mikou

1

Ваш код будет работать правильно, все, что вам нужно сделать, это включить имя пакета перед именем класса. Пример:

public class list { 
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 
     ArrayList<String> list1=new ArrayList<>(); 
     ArrayList<Fruit> list2=new ArrayList<>(); 
     String packageName = "some.package.name"; 
     list1.add("banana"); 
     list1.add("Orange"); 
     list1.add("strawberry"); 
     for (int i = 0; i < list1.size(); i++) { 
      String className=list1.get(i); 
      Class<?> clazz = Class.forName(packageName + "." + className); 
      Object obj = clazz.newInstance(); 
      list2.add((Fruit) obj); 
     } 
    } 
} 

Java не знает, какой класс вы имеете в виду, и по умолчанию он не принимает на себя тот же пакет. Вы должны явно указать, какой пакет. (Если у него нет имени пакета, в этом случае packetName = "")

+0

мой пакетNamee is Malek; Я попробовал класс clazz = Class.forName (Malek.className); но netbeans не принимают его, предложение: создать класик Malek в пакете Malek – Mikou

+0

@Mikou: Не используйте 'Class.forName (Malek.className);', используйте 'Class.forName (« Malek.className »);' как это было предложено в ответе выше. – jlordo

+0

@jlordo i написал снимок экрана для ошибки – Mikou

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