为什么它给我错误“方法ArrayList.add(String)不适用”?

时间:2014-01-21 03:30:09

标签: java arrays list project message

每当我在Java中运行这个驱动程序类时,它都会给我这样的信息:

  

方法java.util.ArrayList.add(java.lang.String)不适用。

我正在做ArrayList,这是我的代码:

 ArrayList<String> categories = new ArrayList<String>();

 categories.add( new Education() );
 categories.add( new Games() ) ;
 categories.add( new  Medical() ) ;

它在.add给我一个错误。

我写了EducationGamesMedical,因为我有我想要连接的单独的类。这些单独的类(例如Education)有一个应用列表,例如教育应用。

2 个答案:

答案 0 :(得分:2)

<强>问题:

ArrayList<String>表示您需要一个可以容纳String个对象的数组支持列表。这会将add方法限制为仅接受字符串。您犯的错误是您将其他非String对象传递给add方法。

错误答案1:

简单的方法是将其更改为ArrayList<Object>,但这会破坏泛型的目的。好消息是,您现在可以将任何对象传递给add方法。不好的是,您现在可以将任何对象传递给add方法。

错误答案2:

您可以改为创建三个ArrayList对象:

ArrayList<Education> eduCategories [...]
ArrayList<Games> gameCategories [...]
ArrayList<Medical> medCategories [...]

但这也很糟糕,因为现在你有三个名单。

好答案:

您只需要一个列表。为此,您必须创建适当的层次结构:

  1. 创建一个名为Category的抽象类:

    abstract class Category
    
  2. 创建三个类EducationGamesMedical,所有类都延伸Category

    class Education extends Category
    class Games extends Category
    class Medical extends Category
    
  3. 然后您可以将列表创建为:

    ArrayList<Category> categories = new ArrayList<Category>();
    
    categories.add( new Education() );
    categories.add( new Games() ) ;
    categories.add( new Medical() ) ;
    

    在这种情况下,您将add方法限制为仅接受Category个对象。由于EducationGamesMedical都是(通过扩展名)Category个对象,因此会被接受。但以下情况将失败:

    categories.add( "some string" ); //compilation error: String is not a Category
    

    所以现在我们可以充分利用泛型(编译时类型保护),同时允许同一列表接受不同的子类。

答案 1 :(得分:1)

您声明了一个String类型的arraylist,但后来尝试用其他非字符串实体填充它。

您可能想要创建一个对象的arraylist:

ArrayList<Object> categories = new ArrayList<Object>();

然后你可以通过从arraylist中引用它们来与类进行交互。

我的回答不正确,这无法正常运作。如果您只需要类别和值,则可以使用:

ArrayList<ArrayList<String>> categories = new ArrayList<ArrayList<String>>();

然后,您可以为每个类别创建更多ArrayLists,填充类别,然后将它们添加到顶级ArrayList:

ArrayList<String> medical = new ArrayList<String>();
medical.add("one");
medical.add("two");
medical.add("etc");
categories.add(medical);