Java kan geen symbool vinden met gekoppelde lijst

Ik probeer te vragen of een lijst een bepaalde reeks bevat.

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.");
}

Ik krijg:

Prog7Methods.java:23: cannot find symbol
symbol  : method contains(java.lang.String)
location: class java.lang.Object
        if (list.contains(p))

Ik snap het niet! Ik heb java.io. * en java.util. * Geïmporteerd. Hoe herkent dit dit niet?

0
Ik probeer nu de zoeklijst van een andere klas te bellen met pm.searchList (scan, lijst); Ik krijg dit: MyProgram7.java:53: searchList (java.util.Scanner, java.util.List) in Prog7Methods kan niet worden toegepast op (java.util.Scanner, MyList ) case 3: pm.searchList (scan, lijst);
toegevoegd de auteur Josh, de bron
Hoi, Josh. Implementeert MyList de lijst-interface? Bekijk mijn antwoord hieronder voor enige richtlijnen over methoden en interfaces en dergelijke.
toegevoegd de auteur Steve J, de bron

6 antwoord

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
toegevoegd
U kunt dit doen List linkedList = (LinkedList) lijst; en call bevat methode op linkedList object. Maar het is beter om de methodehandtekening te veranderen om het inkomende object af te dwingen een lijst te zijn. Casting kan runtime-uitzonderingen veroorzaken als het binnenkomende object geen List -type is.
toegevoegd de auteur Narendra Yadala, de bron
@Josh Hoe heeft u lijst in uw oproeperklasse/methode aangegeven? Het moet Lijst lijst = nieuwe LinkedList in de bellerklasse zijn.
toegevoegd de auteur Narendra Yadala, de bron
@Josh Wat zijn MyList en MyArrayList . Ze lijken niet van het type Lijst te zijn. Verklaar het als volgt in de bellerklasse Lijst lijst = nieuwe LinkedList () en voeg strings toe aan dit lijstobject en roep vervolgens pm.searchList (scan, lijst) aan . Neem even de tijd om een ​​goede tutorial over Collections zoals deze te lezen java.sun.com/developer/onlineTraining/collections/…
toegevoegd de auteur Narendra Yadala, de bron
hoe doe ik dit
toegevoegd de auteur Josh, de bron
Ik krijg nu een foutmelding als ik probeer te bellen, zie hierboven
toegevoegd de auteur Josh, de bron
MyList list = new MyArrayList (); Dit zit in de klas waar ik mee probeer te bellen
toegevoegd de auteur Josh, de bron

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

1
toegevoegd

U moet de lijst als een lijst declareren. In plaats van

public void searchList(Scanner scan, Object list){

gebruik

public void searchList(Scanner scan, List list){

of nog beter:

 public void searchList(Scanner scan, List list){
1
toegevoegd
Ik krijg nu een foutmelding wanneer ik pm.searchList (scan, lijst) vanuit een andere klasse probeer te bellen.
toegevoegd de auteur Josh, de bron

Neem even de tijd om een ​​ object te bestuderen. Alle Java-klassen zijn een subklasse van Object en dus nemen alle Java-klassen de methoden clone (), equals (), finalize (), hashCode (), enzovoort over.

bevat() staat niet in die lijst met objectmethoden. bevat() komt van een andere plaats - een interface genaamd Collection . Een interface definieert een contract voor een bepaalde klasse (en alle klassen zijn uiteindelijk Objecten), waarbij dat contract een lijst is van methoden die moeten worden geïmplementeerd. Verzameling definieert een bevat() -methode en alles dat een verzamelinginterface implementeert, inclusief Lijst - uitvoering van klasse, moet een bevat() methode bevatten.

Wanneer u een lijst opgeeft voor uw methode searchList (), geeft u deze door een parameter Object. Dat betekent dat binnen searchList() de enige methoden die kunnen worden aangeroepen, de methoden zijn die voor Object zijn gedefinieerd, zelfs als de lijst in uw aanroep naar searchList() echt een lijst van een soort is. In zekere zin heeft uw parameterlijst de lijst-i-heid van de lijstparameter "weggecrubd".

Wat u moet doen, zoals al vermeld, is uw parameter wijzigen in Verzameling of Lijst. Op die manier weet de Java-compiler binnen de methode searchList() dat de parameter 'list' in werkelijkheid een List is en dus echt een methode contains() heeft.

Merk op dat List ook een interface is, en het bevat de Collection-interface door het uit te breiden. Dus elke klasse die de lijstinterface implementeert, moet de methoden in de verzameling bieden, evenals de aanvullende lijstmethoden. Moet u lijst of verzameling gebruiken? Mijn mening is om de minst dwingende keuze te gebruiken. Het lijkt erop dat je searchList() alleen contains() gebruikt, dus echt, het zal werken op alles dat Collection implementeert, inclusief bijvoorbeeld Instellen .

Dus ik zou je methode een andere naam geven door te verwijzen naar waar je naar kijkt (binnen een lijst) naar wat je zoekt (de volgende regel).

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.");
}

Laten we nu aannemen dat u uw lijst heeft geïmplementeerd met een ArrayList . Later verander je van gedachten, en besluit je dat een TreeSet is beter. Deze searchForNextLine() -methode zal blijven werken, omdat zowel TreeSet als ArrayList implementaties van Collection zijn. Beter nog, als u besluit om uw eigen lijstklasse te rollen (en zeker weet dat u een echte lijst wilt, en niet een andere soort verzameling), dan moet u, zolang u de lijstinterface implementeert, een bevat() methode (omdat je ook de Collection-interface implementeert als onderdeel van de implementatie van de List-interface), en je het object van je nieuwe klasse kunt doorgeven aan searchForNextLine (), ervan overtuigd dat het prima werkt zonder enige wijzigingen .

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

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
toegevoegd

Foutuitvoer van de compiler is vrij duidelijk. Uw lijstvariabele is niet Lijsttype maar Object. Object heeft geen methode "bevat". Verandering

Object list

naar

List list

of (Java 1.4 en ouder)

List list
0
toegevoegd