Konstruktory w typach sparametryzowanych

Konstruktory w typach sparametryzowanych
Burdzi0
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Futurama
  • Postów: 887
0

Witam!
Jest to pierwszy pościk na tym forum, które swoją drogą przeglądam nie od dziś, lecz wreszcie miałem powód, aby konto założyć.
Uczę się Javy z książki Herberta Schildta i mam problem w rozdziale o typach sparametryzowanych.

Kod, który przedstawiam poniżej jest przykładem z książki i mam problem z jego zrozumieniem.

Kopiuj
public class Gen<T> {
	T ob;
	
	// Przekazanie konstruktorowi referencji
	// do obiektu typu T
	public Gen(T o) {
		ob = o;
	}
	
	T getob(){
		return ob;
	}
	
	void showType(){
		System.out.println("Typ T to " + ob.getClass().getName());
		System.out.println("Hashcode " + ob.hashCode());
	} 

Nie rozumiem, po co autor tworzy obiekt typu T, a następnie przypisuje jego referencję w konstruktorze. Co więcej, ukazany wyżej przykład nie jest wyjątkiem. Autor sam na temat konstruktora pisze:

  • Oto konstruktor klasy.*
Kopiuj
public Gen(T o) {
		ob = o;
}

*Łatwo zauważyć, że parametr o jest egzemplarzem typu T. Podobnie jak wcześniej oznacza to, iż rzeczywisty typ o będzie typem przekazanym do T w momencie tworzenia obiektu Gen. Przypisanie ob do o jest poprawne, ponieważ obie zmienne reprezentują egzemplarze tego samego typu T (wskazanego podczas tworzenia obiektu klasy Gen). *

Przy próbie skompilowania programu bez konstruktora otrzymuję wyjątek:

Kopiuj
 Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	The constructor Gen<Integer>(int) is undefined
	The constructor Gen<String>(String) is undefined 

Co tak naprawdę robi ten konstruktor?

P.S. Przepraszam, jeżeli nie ten dział, duplikat, etc.

Jaca777
  • Rejestracja: dni
  • Ostatnio: dni
0

Co tak naprawdę robi ten konstruktor?

Przypisuje wartość parametru o do pola ob.

Przy próbie skompilowania programu bez konstruktora otrzymuję wyjątek

Nie podałeś tu całego kodu, ale z błędu wynika, że próbujesz wywołać nieistniejący konstruktor. Jeśli chcesz stworzyć obiekt typu Gen<Integer> i przekazać do konstruktora wartość typu Integer, potrzebujesz konstruktora przyjmującego taką wartość, a tak się składa, że go usunąłeś.

Nie rozumiem, po co autor tworzy obiekt typu T, a następnie przypisuje jego referencję w konstruktorze.

A czego konkretnie w tym nie rozumiesz?

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

A gdyby tam nie było typu generycznego to nie miałbyś problemu? Dlaczego tak albo dlaczego nie?

S9
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 3573
0

Jak to co robi konstruktor, inicjalizuje obiekt tworzony...
Ja rozumiem że bywają początkujący ale bez k... przesady

Burdzi0
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Futurama
  • Postów: 887
0

Odpowiedź @Jaca777 rozwiała moje wątpliwości, dziękuję. Temat do zamknięcia.

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.