我试图询问列表是否包含某个字符串。
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。*它怎么不能识别这个?
答案 0 :(得分:1)
因为没有Object.contains()
方法。您的方法签名应该是(Scanner, List)
而不是(Scanner, Object)
答案 1 :(得分:1)
list
是Object
而Object
没有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)
list
是Object
而不是List
。如果您认为它是LinkedList
,则更改方法签名。如果没有,请进行演员表但执行instanceof
。
答案 5 :(得分:0)
编译器的错误输出非常清楚。您的列表变量不是列表类型而是对象。对象没有方法“包含”。 改变
Object list
到
List<String> list
或(Java 1.4及更早版本)
List list