2015-12-08 13 views
5
public int compareTo(Object x) { 
    Task other = (Task)x; 

    if (other.priority == this.priority) { 
     System.out.println("Each task has the same priority level."); 
     return 0; 
    } else if (other.priority > this.priority) { 
     System.out.println(other.priority + "\n" + this.priority); 
     return -1; 
    } else { 
     System.out.println(this.priority + "\n" + other.priority); 
     return 1; 
    } 
} 

To jest kod, który mam dla przypisania programowania dla klasy. Nie jestem pewien, dlaczego używam Task other = (Task)x; lub co tu robimy. Resztę rozumiem. Jeśli ktokolwiek ma szybkie wyjaśnienie, co tak naprawdę tu robi, byłbym wdzięczny. Dziękuję Ci!Dlaczego obsada w compareTo (obiekt)

+1

Czy wdrożenie 'Comparable' lub inny interfejs? Jeśli tak, warto dodać deklarację klasy. –

Odpowiedz

2

Jesteś odlewania Object x do Task other - Object i Task są różne typy, więc trzeba do obsady tak można traktować jako x oczekiwanego typu (i dostać się do jego pola).

Normalnie w compareTo() byś najpierw coś podobnego if (x instanceof Task) przed ślepo rzucając go - jeśli nie robić i typy różnią się wtedy rzeczy padnie)

+1

... a ponieważ tak się nie stanie, coś pójdzie źle, jeśli porównasz zadanie i ciąg. – gnasher729

+0

OK, dziękuję bardzo! –

+0

@SarahDiri: Jeśli ta odpowiedź ci pomogła, zaakceptuj ją :) –

2

Podpis metoda przyjmuje obiekt Object typu tak, aby Odwołaj się do zmiennej priority w obiekcie przekazanym, musi wykonać rzutowanie do obiektu Task, ponieważ zmienna istnieje tylko w klasie Task.

Osobiście uważam, że to była zła praktyka, ponieważ nie wiesz, jaki obiekt jest przekazywany (każda klasa podklasy Object może zostać przekazana), więc instancja sprawdzenia nie pójdzie mniej, mniej chcesz napotkasz błąd runtime klasy ClassCastException.

Alternatywnie można użyć parametru generics, aby określić, do jakiego rodzaju obiektu chcesz się porównywać. Więc zamiast robić to ...

public class Task implements Comparable { 
    private int priority = 1; 

    @Override 
    public int compareTo(Object o) { 
     if (o instanceof Task) { 
      Task t = (Task) o; 
      return this.priority < t.priority; 
     } 

     return -1; 
    } 
} 

... można to zrobić ...

public class Task implements Comparable<Task> { 
    private int priority = 1; 

    @Override 
    public int compareTo(Task t) { 
     return this.priority < t.priority; 
    } 
} 
+0

Czy byłbym w stanie zmienić 'Obiekt x' na coś bardziej konkretnego (w tym przypadku może to być' Zadanie x')? Odniosłem wrażenie z samej lekcji, że było to po prostu "jak to się stało". –

+0

@SarahDiri Jedynymi dwoma sposobami na "zmianę" 'x' z' Object' na 'Task' jest wykonanie rzutowania (które już robisz) lub zmiana parametru metody tak, aby umożliwić tylko przekazywanie obiektów' Task' jako parametr. Java pozwala na to przy użyciu generycznych (tak 'implements porównywalne ' zamiast 'implementuje porównywalne'). Użycie tego pozwoli na przekazanie tylko obiektów 'Task'. – Ocracoke

+0

Zobacz także [Co to jest typ surowy i dlaczego nie powinniśmy go używać?] (Http://stackoverflow.com/questions/2770321/what-is -a-raw-type-and-why-shouldnt-we-use-it) –