Porównywanie typów generycznych

0

Witam,
Piszę kolejkę priorytetową i jak w c++ i C# poszło gładko tak w Javie mam problemy.
Mam metodę wstaw:

 void wstaw(Node<T> p, T a)		// p powinno być przez referencje
	{
		if(p==null)
			p=new Node<T>(a,null,null);
		else if(a<p.val)
			wstaw(p.l,a);
		else if(a>p.val)
			wstaw(p.r,a);
	}

Jak zrobić żeby obiekt p klasy Node<T> był przekazywany przez referencje, żeby metoda wstaw nie dostawała obiektu p który jest zawsze null. w C# jest kluczowe słówko ref. Po drugie muszę porównywać wartości, ale wywala błąd, że nie można użyć "<" dla typów generycznych. Jak to rozwiązać? W C# jest typ dynamic od .NET 4.0 a tu...?

Z góry dzięki za pomoc

0

W Javie wszystkie obiekty są przekazywane przez referencje, tylko prymitywy są przekazywane przez wartość.

W jaki sposób chcesz porównywać typy generyczne? W Javie zastosowano type-erasure, na etapie wykonania nie możesz dobrać się do generycznych parametrów (a jakimiś tam wyjątkami niby).

Jeśli chcesz stworzyć metodę która wybiera z tablicy elementy, o jakimś typie (klasie), to musisz tą klasę przekazać jako parametr, np:

<T> T wezJakisElementTypu(Class<T>klasa)

Jest to metoda sparametryzowana.

W C# przy każdym parametryzowaniu w rzeczywistości tworzysz nową klasę, np List<Krzesło> to w C# inna klasa niż List<Stolik>, ale w Javie to jest jedna i ta sama klasa bo informacje o typach parametrycznych (czy jak to tam zwał) są wymazywane.

0

No i jaką masz pewność, że dana klasa ma zdefiniowane metody < i > (pomijając to, że nie może mieć)? W Javie do porównywania obiektów używa się Comparable.compareTo(Object) (Node powinno być parametryzowane typem <T extends Comparable<T>>).

0
costamcos napisał(a)

Witam,
Piszę kolejkę priorytetową i jak w c++ i C# poszło gładko tak w Javie mam problemy.
Mam metodę wstaw:

 void wstaw(Node<T> p, T a)		// p powinno być przez referencje
	{
		if(p==null)
			p=new Node<T>(a,null,null);
		else if(a<p.val)
			wstaw(p.l,a);
		else if(a>p.val)
			wstaw(p.r,a);
	}

Po pierwsze, w Java nie ma przeladowania operatorow wiec uzycie < oraz > dla obiektow jest nie mozliwe. Wyjatkiem sa Wrappery dla typow prymitywnych dla ktorych dziala autoboxing.
Po drugie w Java klasa generyczna, jest klasa generyczna dla programisty i kompilatora nie dla JVM. Oznacza to, ze po kompilacji, po typach generycznych nie ma sladu.

Zeby twoj kod dzialal, musisz zamiast znakow porownania wywolac metode compareTo() a typ parametryczny T musi byc zdefiniowany jako <T extends Comparable<T>>. Dzieki temu na T bedziesz mogl wywolywac metody z klasy Object oraz interfejsu Comparable.

Wibowit napisał(a)

W Javie wszystkie obiekty są przekazywane przez referencje, tylko prymitywy są przekazywane przez wartość.

Nie do konca. W przypadku obiektow przekazywana jest kopia ich referencji. Subtelna aczkolwiek istotna roznica.

0
folly napisał(a)
Wibowit napisał(a)

W Javie wszystkie obiekty są przekazywane przez referencje, tylko prymitywy są przekazywane przez wartość.

Nie do konca. W przypadku obiektow przekazywana jest kopia ich referencji. Subtelna aczkolwiek istotna roznica.

Dokladnie. Ja bym nawet poszedl dalej - w Javie wszystko jest przekazywane przez wartosc, nawet referencje, ale dostaje sie ich kopie ktore odresuja ten sam obiekt na stosie.

0

Napisałem, że obiekty są przekazywane poprzez referencje, a nie że referencje są przekazywane przez referencje :P Wiadomo, że w Javie nie można mieć referencji do jakiegoś pola w obiekcie (no chyba, że poprzez refleksję), można mieć tylko referencję do obiektu. Jak widać można to różnie rozumieć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1