Java无法找到带有链表的符号

时间:2011-10-27 15:58:50

标签: java list

我试图询问列表是否包含某个字符串。

public void searchList(Scanner scan, Object list){


    System.out.println("Search for element:\t");
    String p = scan.nextLine();

    if (list.contains(p))
        System.out.println(p + " is in the list");
    else
        System.out.println(p + " is not in the list.");
}

我得到了:

Prog7Methods.java:23: cannot find symbol
symbol  : method contains(java.lang.String)
location: class java.lang.Object
        if (list.contains(p))
我不明白!我导入了java.io. *和java.util。*它怎么不能识别这个?

6 个答案:

答案 0 :(得分:1)

因为没有Object.contains()方法。您的方法签名应该是(Scanner, List)而不是(Scanner, Object)

答案 1 :(得分:1)

listObjectObject没有contains方法。您需要先将其转换为List以调用contains方法。或者,您可以更改方法签名以接收List

答案 2 :(得分:1)

您需要将列表声明为List。而不是

public void searchList(Scanner scan, Object list){

使用

public void searchList(Scanner scan, List list){

甚至更好:

 public void searchList(Scanner scan, List<String> list){

答案 3 :(得分:1)

花点时间研究Object。所有Java类都是Object的子类,因此所有Java类都继承方法clone(),equals(),finalize(),hashCode()等。

contains()不在Object方法列表中。 contains()来自不同的地方 - 一个名为Collection的界面。接口为某个类定义了一个契约(并且所有类最终都是对象),该契约是必须实现的方法列表。 Collection定义了一个contains()方法,实现Collection接口的所有东西,包括任何List - 实现类,都必须提供contains()方法。

当您为searchList()方法提供列表时,您将通过Object参数传递它。这意味着在searchList()中,可以调用的唯一方法是为Object定义的方法,即使调用searchList()中的列表确实是某种类型的列表。从某种意义上说,您的参数列表已“清除”列表参数的列表。

如上所述,您应该做的是将参数更改为Collection或List。这样,在您的searchList()方法中,Java编译器知道“list”参数实际上是List,因此实际上有一个contains()方法。

请注意,List也是一个接口,它通过扩展它包含Collection接口。因此,实现List接口的每个类都必须提供Collection中的方法以及其他List方法。你应该使用List还是Collection?我的意见是使用最少约束的选择。看起来你的searchList()只使用contains(),所以它确实适用于任何实现Collection的东西,包括例如Set

因此,我会将您的方法重命名为从您所查找的位置(列表内部)到您要查找的内容(下一行)。

public void searchForNextLine(Scanner scan, Collection lines){


    System.out.println("Search for element:\t");
    String p = scan.nextLine();

    if (lines.contains(p))
        System.out.println(p + " is in the collection of lines");
    else
        System.out.println(p + " is not in the collection of lines.");
}

现在假设您已使用ArrayList实施了列表。之后你会改变主意,决定TreeSet更好。此searchForNextLine()方法将继续工作,因为TreeSet和ArrayList都是Collection的实现。更好的是,如果你决定推出自己的列表类(并确定你想要一个真正的List,而不是其他类型的Collection),那么只要你实现List接口,你就会被迫提供一个contains()方法(因为您还将实现Collection接口作为实现List接口的一部分),并且您可以将新类的对象传递给searchForNextLine(),相信它将完美地工作而不需要任何更改

public class MyListClass<T> implements List<T> {
  // all the methods required to implement a List interface
}

答案 4 :(得分:0)

listObject而不是List。如果您认为它是LinkedList,则更改方法签名。如果没有,请进行演员表但执行instanceof

答案 5 :(得分:0)

编译器的错误输出非常清楚。您的列表变量不是列表类型而是对象。对象没有方法“包含”。 改变

Object list

List<String> list

或(Java 1.4及更早版本)

List list