6 svar
62 visningar
espeon 3
Postad: 11 mar 16:43 Redigerad: 11 mar 18:37

Fel typkonvertering Objekt-String

Hej, jag har försökt lösa det som felmeddelandet säger. Här är min kod till uppgiften:

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

 

public class DogCollection {

    ArrayList<Dog> dogList = new ArrayList<>();

 

    public DogCollection() {

        this.dogList = new ArrayList<>();

    }

    public boolean addDog(String dogName) {

        if (dogList.contains(dogName)) {

            return false;

        }

        dogList.add(dogName);

        return true;

    }

 

    public boolean removeDog(String dogName) {

        if (dogList.contains(dogName)) {

            dogList.remove(dogName);

            return true;

        } else {

            return false;

        }

    }

 

    public boolean containsDog(String dogName) {

        return dogList.contains(dogName);

    }

 

    public boolean containsDog(Dog dogName) {

        return dogList.contains(dogName);

    }

 

    public Dog getDog(String dogName) {

        for (Dog dog : dogList) {

            if (dog.getName().equals(dogName)) {

                return dog;

            }

        }

        return null;

    }

 

    public ArrayList<Dog> getDogs() {

        ArrayList<Dog> sortedDogs = new ArrayList<>(dogList);

        Collections.sort(sortedDogs, Comparator.comparing(Dog::getName));

        return sortedDogs;

    }

 

public List<Dog> getDogsWithTail(int tailLength) {

List<Dog> dogsWithLongTail = new ArrayList<>();

for (Dog dog : dogs) {

if (dog.getTailLength() >= tailLength)

{ dogsWithLongTail.add(dog); } }

Collections.sort(dogsWithLongTail); return dogsWithLongTail; }

 

}

Felmeddelandet säger om och om igen DogCollectionTest.java:104 incompatible types: Dog cannot be converted to java.lang.String". Jag har försökt lösa det genom att vid deklaration av ArrayList skriva Dog för innan stod det String, men det var kvar samma felmeddelande. Jag ändrade också ArrayListen i den sista metoden, från <String> till <Dog>. Det jag inte förstår är vad mer jag ska ändra till från String till Dog, för i klassdiagrammet i uppgiften står det att man bl.a. ska överlagra metoder både String och boolean. Dessutom ska containsDog vara hjälpmetod till addDog.

sictransit Online 444 – Livehjälpare
Postad: 11 mar 17:23 Redigerad: 11 mar 17:24

Hej och välkommen!

Börja med att redigera ditt inlägg och formatera ditt program som kod. Det finns en funktion för att infoga programmeringskod. Som den står nu är den jobbig att läsa.

Du har säkert en klass Dog någonstans också. Den vore bra att se, även om jag kan gissa hur den ser ut.

Som det är nu borde ditt program inte ens kompilera. Om du inte vet vad kompileringsfelen betyder, så är de också jättebra att bifoga frågan. 

Jag tror du behöver fundera lite på skillnaden mellan Dog och String. De är två olika klasser och inte utbytbara. 

Din dogList kan bara innehålla objekt av typen Dog. Det går inte att stoppa dit objekt av typen String. Det går heller inte att kontrollera med contains() om en String finns, eftersom det är en lista av Dog.

Här är ett exempel som jag kommenterat lite.

// Den här metoden heter addDog() men tar inte ett objekt av typen Dog som argument.
// Istället tar den ett dogName av typen String.
public boolean addDog(String dogName) {

	// dogList kan inte innehålla en String; den innehåller bara Dog. 
	// Kompilatorn borde skrika, eftersom det inte går ihop.
        // Du har en metod längre ned som kontrollerar om det finns en hund med givet namn. Den ser helt OK ut.
	if (dogList.contains(dogName)) {

		return false;

	}

	// På samma sätt kan du inte lägga till en String i listan.
        // Du skulle kunna göra något i stil med detta:
        // Dog newDog = new Dog();
        // newDog.setName(dogName);
        // dogList.add(newDog);
	dogList.add(dogName);

	return true;

}
Laguna 28752
Postad: 11 mar 18:11

Kan flera hundar ha samma namn?

Laguna skrev:

Kan flera hundar ha samma namn?

Klart relevant fråga, men innan koden ens kompilerar så är den överkurs oavsett vad uppgiften säger. 

espeon 3
Postad: 11 mar 18:48
sictransit skrev:

Hej och välkommen!

Börja med att redigera ditt inlägg och formatera ditt program som kod. Det finns en funktion för att infoga programmeringskod. Som den står nu är den jobbig att läsa.

Du har säkert en klass Dog någonstans också. Den vore bra att se, även om jag kan gissa hur den ser ut.

Som det är nu borde ditt program inte ens kompilera. Om du inte vet vad kompileringsfelen betyder, så är de också jättebra att bifoga frågan. 

Jag tror du behöver fundera lite på skillnaden mellan Dog och String. De är två olika klasser och inte utbytbara. 

Din dogList kan bara innehålla objekt av typen Dog. Det går inte att stoppa dit objekt av typen String. Det går heller inte att kontrollera med contains() om en String finns, eftersom det är en lista av Dog.

Här är ett exempel som jag kommenterat lite.

// Den här metoden heter addDog() men tar inte ett objekt av typen Dog som argument.
// Istället tar den ett dogName av typen String.
public boolean addDog(String dogName) {

	// dogList kan inte innehålla en String; den innehåller bara Dog. 
	// Kompilatorn borde skrika, eftersom det inte går ihop.
        // Du har en metod längre ned som kontrollerar om det finns en hund med givet namn. Den ser helt OK ut.
	if (dogList.contains(dogName)) {

		return false;

	}

	// På samma sätt kan du inte lägga till en String i listan.
        // Du skulle kunna göra något i stil med detta:
        // Dog newDog = new Dog();
        // newDog.setName(dogName);
        // dogList.add(newDog);
	dogList.add(dogName);

	return true;

}

Hej! Tack för dina förklaringar. Jag har svårt att urskilja Dog från String. Då förstår jag varför kompilatorn inte kan tolka, men samtidigt förstår jag inte det hela.

Uppgiften lyder:

Den första klassen som ska implementeras är DogCollection som håller reda på alla hundar i hundregistret. Figur 5 sammanfattar klassens publika gränssnitt. De enskilda metoderna beskrivs i mer detalj på efterföljande sidor. Det är tillåtet att lägga till ytterligare metoder till klassen om du vill, men dessa ska då vara privata.. 

I klassdiagrammet står det bl a både removeDog boolean Dog och removeDog boolean String vilket gör mig förvirrad. Syftet här är att öva på metodöverlagring.. 

Vad gäller ex. addDog får en hund bara läggas till om den har ett unikt namn. containsDog ska funka som "hjälpmetod". 

Min hundklass för Dog är för lång för att inkludera men det innehåller ålder, ras, svanslängd, vikt, och namn. 

espeon 3
Postad: 11 mar 18:49
Laguna skrev:

Kan flera hundar ha samma namn?

Mmm, alltså en hund får bara läggas till om den har ett unikt namn

Du har en getDog(String) som ser OK ut. Den returnerar en Dog eller null.

Du har två containsDog():

  • containsDog(Dog) ser OK ut.
  • containsDog(String) kan inte fungera. Den skulle dock kunna använda getDog(String) för att se om Dog med givet namn finns eller inte. Att återanvända kod är bra, så man bara har en funktion på ett ställe.

removeDog(String) behöver använda containsDog(String) för att se om den finns. Du behöver dock hämta objektet av typ Dog för att kunna ta bort det ur listan. Det är ju precis vad getDog() returnerar, så kanske kan du använda den istället för att anropa containsDog(String).

addDog(String) behöver använda containsDog(String) för att kontrollera om den redan finns. Om den inte gör det, så är det en Dog du kan lägga till listan och inte en String. Du behöver skapa en instans av Dog och sätta dess namn, innan du gör dogList.add().

Det är inte lätt att supporta programmering via forum, när det blir så här många kommentarer. Jag finns på Livehjälpen också om det behövs.

Hoppas det hjälpte och du kommer vidare.

Svara Avbryt
Close