0

我有一个 Arraylist list1 (banana,orange...) ,我有一个类 fruit 。我想创建一个 Arraylist list2 ,它的元素是 fruit 的实例,实例的名称是 list1 的元素。我做了所有同名的意图,但我需要每个实例的特定名称。这在java中可能吗?我试过了,但它对我不起作用

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;
    }

}

在此处输入图像描述

4

3 回答 3

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 = ""

于 2013-08-12T16:06:48.470 回答
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);
于 2013-08-12T16:03:09.913 回答
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);
}

创建类,然后检索类名以填充名称数组。

我更推荐的是创建一个水果类,其中包含用于水果名称的 getter 和 setter。就像是...

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

将名称与您的水果类相关联。

于 2013-08-12T16:03:48.460 回答