花點時間來研究Object。所有Java類都是Object的子類,所以所有的Java類都繼承了clone(),equals(),finalize(),hashCode()等方法。
contains()不在Object方法的列表中。 contains()來自不同的地方 - 一個名爲Collection的接口。一個接口爲某個類定義了一個契約(並且所有類最終都是對象),該契約是必須實現的方法列表。 Collection定義了一個contains()方法,並且實現了Collection接口的所有東西,包括任何實現類,都必須提供一個contains()方法。
當您向searchList()方法提供列表時,您將通過Object參數傳遞它。這意味着在searchList()中,即使您在調用searchList()的列表真的是某種列表時,唯一可以調用的方法也是爲Object定義的方法。從某種意義上說,您的參數列表已「清除」了列表參數的列表內容。
你應該做的,正如已經提到的那樣,將你的參數改爲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接口,你將被迫提供一個contains()方法(因爲你還將實現Collection接口作爲實現List接口的一部分),並且你可以將新類的對象傳遞給searchForNextLine(),相信它能夠完全正常工作而不會有任何改變。
public class MyListClass<T> implements List<T> {
// all the methods required to implement a List interface
}
我現在正在嘗試從pm.searchList(scan,list)調用其他類的搜索列表;我得到這個:Prog7Methods中的MyProgram7.java:53:searchList(java.util.Scanner,java.util.List)不能應用於(java.util.Scanner,MyList)情況3: pm.searchList(掃描,列表); –
Josh
嗨喬希。 MyList是否實現了List接口?查看下面的答案,瞭解關於方法和接口等的一些指導。 –