Java找不到具有链表的符号

Java找不到具有链表的符号,java,list,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 Syst

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

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.*它怎么会不识别呢?

list
是一个
对象
不是
列表
。如果您认为它是一个
链接列表
,请更改方法签名。如果不是,则进行强制转换,但执行
实例。如果
列表是
对象
而不是
列表
。如果您认为它是一个
链接列表
,请更改方法签名。如果没有,则进行强制转换,但执行
实例,因为没有
对象.contains()
方法。您的方法签名可能应该是
(扫描器,列表)
而不是
(扫描器,对象)
,因为没有
对象.contains()
方法。您的方法签名可能应该是
(扫描器,列表)
而不是
(扫描器,对象)
列表
对象
并且
对象
没有
包含
方法。首先需要将其强制转换为
列表
以调用
包含
方法。或者,您可以更改方法签名以接收
列表

列表
对象
并且
对象
没有
包含
方法。首先需要将其强制转换为
列表
以调用
包含
方法。或者,您可以更改方法签名以接收
列表

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

public void searchList(Scanner scan, Object list){
使用

或者更好:

 public void searchList(Scanner scan, List<String> list){
公共无效搜索列表(扫描程序扫描,列表){

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

public void searchList(Scanner scan, Object list){
使用

或者更好:

 public void searchList(Scanner scan, List<String> list){
公共无效搜索列表(扫描程序扫描,列表){

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


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

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

contains()不在该对象方法列表中。contains()来自另一个位置—一个名为的接口。接口为某个类(所有类最终都是对象)定义约定,该约定是必须实现的方法列表。集合定义contains()方法以及实现集合接口的所有内容,包括任何实现类,都必须提供contains()方法

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

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

请注意,List也是一个接口,它通过扩展它来合并Collection接口。因此,实现List接口的每个类都必须提供Collection中的方法以及其他List方法。您应该使用List还是Collection?我的意见是使用约束最少的选择。看起来您的searchList()只使用contains(),所以实际上,它可以处理实现集合的任何内容,例如

因此,我将您的方法从引用您正在查找的位置(列表内部)重命名为您正在查找的位置(下一行)

现在让我们假设您已使用实现了列表。稍后您会改变主意,决定a更好。此searchForNextLine()方法将继续工作,因为TreeSet和ArrayList都是集合的实现。如果您决定使用自己的list类,则更好(并且确保您想要的是一个实际的列表,而不是其他类型的集合),那么只要实现List接口,就必须提供一个contains()方法(因为在实现List接口的过程中还需要实现Collection接口),并且您可以将新类的对象传递给searchForNextLine(),确信它将在不做任何更改的情况下正常工作

public class MyListClass<T> implements List<T> {
  // all the methods required to implement a List interface
}
公共类MyListClass实现列表{
//实现列表接口所需的所有方法
}
花点时间研究一个。所有Java类都是Object的子类,因此所有Java类都继承方法clone()、equals()、finalize()、hashCode(),等等

contains()不在该对象方法列表中。contains()来自另一个位置—一个名为的接口。接口为某个类(所有类最终都是对象)定义约定,该约定是必须实现的方法列表。集合定义contains()方法以及实现集合接口的所有内容,包括任何实现类,都必须提供contains()方法

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

如前所述,您应该做的是将参数更改为Collection或List
List list
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.");
}
public class MyListClass<T> implements List<T> {
  // all the methods required to implement a List interface
}