Interfejs + wywolanie polimorficzne problem z kodem

Interfejs + wywolanie polimorficzne problem z kodem
NA
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:8
0

Witam,
Prosilbym o pomoc z ponizszym kodem:

Kopiuj
 interface Sortable{

  int compare(Object obj1,Object obj2);

}

class Int implements Sortable{
private int x;
public Int(){
}
public Int(int x){
	this.x=x;
}
public int compare(Object obj1,Object obj2){
if(obj1.x>obj2.x) return 1;
if(obj1.x<obj2.x) return -1;
else return 0;

}
}
class TestInter { 

 public static void main(String args[]) 
 { 
   Sortable sort=new Int();

   Sortable sort1=null; 
   Sortable sort2=null; 

   sort1=new Int(230);
   sort2=new Int(5);


   System.out.println("----- porównywanie liczb-----");

   System.out.println(sort.compare(sort1,sort2)); //wywołanie polimorficzne

  } 

}

Jak prawidlowo odwolac sie do pola obiektu aby moc dokonac porownania.
Tutaj wywala mi błędy:

Kopiuj
 
public int compare(Object obj1,Object obj2){
if(obj1.x>obj2.x) return 1;
if(obj1.x<obj2.x) return -1;
else return 0;

}

Pozdrawiam

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 11 godzin
1

Klasa Object nie definiuje dostępnego publicznie pola x.

Rozwiązanie 1: Rzutowanie.
Rozwiązanie 2 (lepsze): Genericsy: http://docs.oracle.com/javase/tutorial/java/generics/index.html


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
NA
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:8
0

A mógłbyś wytłumaczyć jak wykonać to rzutowanie? Bo gdy robię coś takiego:

Kopiuj
public int compare(Object obj1,Object obj2){
if((int)obj1>(int)obj2) return 1;
if((int)obj1<(int)obj2) return -1;
else return 0;


}
 

To wypluwa mi błąd:

Kopiuj
 
Exception in thread "main" java.lang.ClassCastException: Int cannot be cast to java.lang.Integer
	at Int.compare(zad24.java:15)
	at TestInter.main(zad24.java:37)

Dzieki.

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 11 godzin
1

Najpierw:

Kopiuj
Object o = cośtam...;

Potem:

Kopiuj
Klasa k = (Klasa) o;
k.metoda();

Lub:

Kopiuj
((Klasa) o).metoda();

PS: w tym przypadku nie metoda(), a pole x.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
NA
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:8
0

Teraz wszystko działa . Dziękuje za pomoc. Poprawiony kod może komuś się przyda.

Kopiuj
interface Sortable{

  int compare(Object obj1,Object obj2);

}

class Int implements Sortable{
private int x;
public Int(){
}
public Int(int x){
	this.x=x;
}
public int compare(Object obj1,Object obj2){
Int int1=(Int)obj1;
Int int2=(Int)obj2;
if(int1.x>int2.x) return 1;
if(int1.x<int2.x) return -1;
else return 0;


}
}
class TestInter {

 public static void main(String args[])
 {
   Sortable sort=new Int();

   Sortable sort1=null;
   Sortable sort2=null;

   sort1=new Int(230);
   sort2=new Int(5);


   System.out.println("----- porównywanie liczb-----");

   System.out.println(sort.compare(sort1,sort2)); //wywołanie polimorficzne

  }

} 
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 11 godzin
0

Kod źródłowy klasy java.lang.Integer jest rozpowszechniany razem z JDK, więc w sumie kto będzie chciał coś podobnego co tu zrobiłeś to raczej tam zajrzy. Klasa java.lang.Integer z Javy implementuje java.lang.Comparable<Integer>, który jest wymagany przez metodę Arrays.sort(Object[]) czy <T extends Comparable<? super T>> java.util.Collections.sort(List<T>) albo konstruktory java.util.TreeMap<K, V>.

Postaraj się niedługo przerobić genericsy ;)


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
NA
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:8
0

Ok :)

airborn
  • Rejestracja:prawie 16 lat
  • Ostatnio:prawie 7 lat
  • Postów:274
0

Nie powinno się na ślepo rzutować obiektów, zobacz co się stanie jeżeli wywołasz:
System.out.println(sort.compare(sort1,new Object()))

NA
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 13 lat
  • Postów:8
0

Jakie według Ciebie w takim razie byłoby najlepsze rozwiązanie ?

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 11 godzin
0

W tym przypadku i w wielu innych przypadkach rozwiązaniem problemu są genericsy, o których napisałem już w 1. odpowiedzi.

Rzutowanie czasem jest niezbędne (pattern matching to też rzutowanie), ale najlepiej jak używa się go jak najmniej. Np przy "gołej" kolekcji typu List (zamiast List<Klasa>) nie od razu wiadomo, co się w niej znajduje i trzeba to wydedukować z kodu (także z rzutowań). Jeśli w którymś momencie zechcesz zmienić typ przechowywanych obiektów to bez genericsów będziesz musiał szukać ręcznie rzutowań po całym kodzie (i je odpowiednio zamieniać), zamiast po prostu poprawiać miejsca wskazane przez kompilator/ IDE.
Generalnie zresztą główną zaletą genericsów to to, że zmniejsza się ilość kodu - zamiast robić rzutowania w X miejscach, parametryzuje się klasę w jednym.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.