Java не можа знайсці сімвал са звязаным спісам

Я спрабую спытаць, калі спіс змяшчае пэўную радок.

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
Я зараз спрабую выклікаць пошук спіс з іншага класа з pm.searchList (сканаванне, спіс); Я атрымліваю гэта: MyProgram7.java:53: спискупоиска (java.util.Scanner, java.util.List) у Prog7Methods не можа быць ужыты да (java.util.Scanner, MyList ) Прыклад 3: pm.searchList (сканаванне, спіс);
дададзена аўтар Josh, крыніца
Прывітанне Джош. Ці ёсць рэалізаваць MyList інтэрфейс List? Праверце мой адказ ніжэй для пэўных указанняў адносна метадаў і інтэрфейсаў і таму падобных.
дададзена аўтар Steve J, крыніца

6 адказы

list is a Object and Object does not have contains method. You need to cast it to a List first to call contains method. Or, you can change the method signature to receive a List.

1
дададзена
Вы можаце зрабіць гэта LinkedList = (LinkedList) Спіс Спіс і выклік ўтрымлівае метад на LinkedList аб'екта. Але лепш практыка, каб змяніць сігнатуру метаду для забеспячэння якое ўваходзіць аб'екта быць List . Адліўка можа стаць прычынай ўзнікнення выключэння часу, калі які ўваходзіць аб'ект не з'яўляецца List тып.
дададзена аўтар Narendra Yadala, крыніца
@Josh Як жа вы аб'яўляеце List у вашым класе выклікае абанента/метаду. Ён павінен быць спіс List = новы LinkedList у класе выклікае абанента.
дададзена аўтар Narendra Yadala, крыніца
@Josh Якія MyList і MyArrayList . Яны, здаецца, не быць тыпу Спіс . Абвясьцеце гэта так у класе выклікае абанента List Спіс = новы LinkedList () і дадаць радкі ў гэты спіс аб'ектаў, а затым выклікаць pm.searchList (скан, спіс) . Калі ласка, знайдзіце час, каб прачытаць добры падручнік па Калекцыі як гэты
дададзена аўтар Narendra Yadala, крыніца
як я гэта раблю
дададзена аўтар Josh, крыніца
Цяпер я атрымліваю паведамленне пра памылку пры спробе выкліку, глядзіце вышэй
дададзена аўтар Josh, крыніца
MyList спіс = новы MyArrayList (); Гэта ў класе я спрабую патэлефанаваць з
дададзена аўтар Josh, крыніца

Because there is no Object.contains() method. Your method signature should probably be (Scanner, List) not (Scanner, Object)

1
дададзена

Вы павінны абвясьціць спіс як спіс. Замест

public void searchList(Scanner scan, Object list){

выкарыстанне

public void searchList(Scanner scan, List list){

або яшчэ лепш:

 public void searchList(Scanner scan, List list){
1
дададзена
Цяпер я атрымліваю паведамленне пра памылку пры спробе выкліку pm.searchList (сканаванне, спіс) з іншага класа.
дададзена аўтар Josh, крыніца

Знайдзіце хвілінку, каб вывучыць у Object . Усе класы Java з'яўляюцца падкласа Object, і таму ўсе класы Java ўспадкуюць клон метады (), роўна (), завяршыць (), хэш-код (), і гэтак далей.

змяшчае() не знаходзіцца ў гэтым спісе метадаў аб'екта. змяшчае() прыходзіць з іншага месца - інтэрфейс пад назвай калекцыя . Інтэрфейс вызначае кантракт для некаторага класа (і ўсе класы ў канчатковым рахунку, аб'екты), што кантракт будучы спіс метадаў, якія павінны быць рэалізаваныя. Калекцыя вызначае, змяшчае метад (), і ўсё, што рэалізуе інтэрфейс Collection, уключаючы любы Спіс -implementing клас павінен забяспечыць змяшчае() метад.

Калі вы падасце спіс вашага метаду спискупоиска (), вы перадаеце яго праз параметр Object. Гэта азначае, што ў спискупоиска (), адзіныя метады, якія могуць быць названыя тыя, вызначанай для аб'екта, нават калі спіс ў выкліку спискупоиск() на самой справе спіс нейкага. У пэўным сэнсе, ваш спіс параметру «выняты з» спісу-я-Нес параметру спісу.

Тое, што вы павінны рабіць, так як ужо згадвалася, гэта змяніць параметр ў калекцыі або спісу. Такім чынам, у вашым метадзе спискупоиска (), кампілятар Java ведае, што параметр «спіс» сапраўды спіс, і таму сапраўды мае змяшчае() метад.

Адзначым, што спіс з'яўляецца таксама інтэрфейс, і ён уключае інтэрфейс Collection, пашыраючы яго. Такім чынам, кожны клас, які рэалізуе інтэрфейс List павінен прадаставіць метады збору, а таксама дадатковыя метады List. Калі вы карыстаецеся List або Collection? Маё меркаванне заключаецца ў выкарыстанні найменш стрымальны выбару. Падобна на тое, што ваш спискупоиск() выкарыстоўвае толькі змяшчае (), так што на самой справе, ён будзе працаваць на што-небудзь, які рэалізуе Collection, у тым ліку, напрыклад, Set .

Таму я хацеў бы перайменаваць метад з выгляду, калі вы глядзіце (унутры спісу), што вы шукаеце (у nextline).

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), і вы можаце перадаць аб'ект вашага новага класа searchForNextLine (), упэўнены, што ён будзе працаваць выдатна без якіх-небудзь змяненняў на ўсіх ,

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

1
дададзена

list is an Object not a List. If you think it is a LinkedList then change the method signature. If not, make a cast but do an instanceof.

0
дададзена

Выхад памылкі кампілятара цалкам зразумела. Ваш спіс зменная не Пералічыце тып, але аб'ект. Аб'ект мае ніякага метаду «не ўтрымлівае». змена

Object list

у

List list

або (Java 1.4 і старэй)

List list
0
дададзена