Typy obiektów różnica

0

Czym różnią się w poniższym fr. kodu metody first, second, third i fourth?

 
	public static <T> Vector<T>  first (Vector<T> vector) {
		return vector;
	}
	
	public static Vector<Object> second (Vector<Object> vector) {
		return vector;
	}
	
	public static Vector<?> third (Vector<?> vector) {
		return vector;
	}
	
	public static Vector<? extends Object> fourth (Vector<? extends Object> vector) {
		return vector;
	}
2

Nie rozumiem pytania. Przecież widać gołym okiem.
Czytaj:
https://docs.oracle.com/javase/tutorial/extra/generics/subtype.html
https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

first jest generyczna, tzn przyjmuje i zwraca kolekcje dowolnego typu, pozwala na dodawanie do kolekcji bo będzie wiadomo dokładnie z jakim typem pracujesz

second przyjmuje kolekcje Objectów i zwraca też kolekcje Objectów. Warto rozumieć że w javie np. List<Object> wcale nie jest związane z List<InnaKlasa>. Nie możesz listy obiektów InnaKlasa przypisać do listy Objectów.

third łyknie wszystko, w przeciwieństwie do second, ale masz tam "niewiadomy" typ, więc masz wewnatrz metody dostępne tylko metody z Object no i nie możesz nic do tej kolekcji dodawać! no bo nie wiadomo jakiego typu są tam obiekty!

fourth łyka wszystkie kolekcje obiektów które rozszerzają Object, czyli generalnie wszystkie możliwe kolekcje. Taka konstrukcja jest mało przydatna, ale gdyby tam było np. ? extends Comparable to zaczyna mieć dużo większy sens ;] ale znów nie da sie do tych kolekcji nic dodać, bo nie wiadomo jakie obiekty są w kolekcji przechowywane, wiemy tylko że są jakąś podklasą zadanego typu ;]

0

Tak jak @Shalom pytanie ewidentnie z podstaw języka, poczytaj linki od Shaloma, jeśli Ci to nie rozświetli problemu to zajrzyj do książki Java Generics and Collections lub na linka http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

0

@Shalom
Dziękuję za odpowiedź.

Czy dobrze rozumiem:

  • first przyjmuję i zwraca Vector o elementach pewnego konkretnego typu, który może zostać ust. dużo wcześniej
  • second przyjmuje i zwr. Vector o elementach klasy Object (tylko i wyłącznie bez podklas)
  • third generalnie to, co first, ale tego, co wpisuję na konkretnym przykładzie za ? nie mogę wcześniej ustalać
  • fourth... Czy może istnieć w Javie jakiś obiekt, ktory nie jest typu ? extends Object?

Chodzi mi głównie o różnicę pomiędzy first oraz third oraz pytanie do fourth :)

0

Wiesz co, poczytaj to co Ci daliśmy, wróć za tydzień/miesiąc jeśli będziesz miał jeszcze pytania

2
  1. Nie. Faktyczny typ będzie ustalony dopiero później, jak użyjesz takiej metody :P Ale wyobraź sobie że wewnątrz tej metody wyciągasz z kolekcji obiekty i dodajesz, np. dlatego że chcesz je sortować. Musisz więc mieć możliwość dodawać/usuwać obiekty z kolekcji, więc musisz tutaj użyć generic method.
  2. Tak.
  3. Nie. Zupełnie nie tak jak 1. Jak używasz wildcarda to zwykle oznacza że chcesz po prostu przyjąć coś dowolnego typu i tyle. Ale nie możesz już na przykład do takiej kolekcji niczego dodać.
  4. Nie, nie może, dlatego napisalem że przykład taki-sobie. Zapis jest w takiej sytuacji wlaściwie równoważny 3. Ale w praktyce taki zapis stosuje się w innej sytuacji -> kiedy ustalasz zależność wildcarda od jakiegoś typu/interfejsu. Jak zrobisz tam np. ? extends Comparable to mógłbyś napisać metodę która zwraca max/min bo mógłbyś porównywać obiekty które dostałeś na wejściu.

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