- No i na koniec jeszcze jeden mały wykład na temat Generic.
Teraz powiem ci, jak ominąć „wymazywanie typu” (wymazywanie typu).
- Tak. To też chcę wiedzieć.
- Jak zapewne już wiesz, Java ma typ Class, który służy do przechowywania referencji do obiektu klasy. Przykłady:
Class clazz = Integer.class;
Class clazz = String.class;
Class clazz = "abc".getClass();
- Tak.
Ale prawdopodobnie nie wiesz, że istnieje jeszcze jedna klasa, Class, która jest Generic. A zmienne tej klasy ogólnej mogą przechowywać odwołania tylko do typu, który był typem parametru. Przykłady:
Class<Integer> clazz1 = Integer.class; //все отлично работает
Class<String> clazz2 = Integer.class; //ошибка компиляции.
Class<String> clazz1 = String.class; //все отлично работает
Class<String> clazz2 = int.class; //ошибка компиляции.
Class<? extends String> clazz1 = "abc".getClass(); //все отлично работает
Class<Object> clazz2 = "abc".getClass(); //ошибка компиляции.
- Dlaczego to tak działa?
- Faktem jest, że wartość pola class typu Integer (czyli typu Integer.class) jest w rzeczywistości obiektem typu Class<Integer>.
Ale idźmy dalej.
Tak więc, korzystając z faktu, że Class<T> jest Generic i faktu, że zmienna tego typu może przechowywać tylko wartość typu T, możesz stworzyć tę trudną kombinację:
class Zoo<T>
{
Class<T> clazz;
ArrayList<T> animals = new ArrayList<T>();
Zoo(Class<T> clazz)
{
this.clazz = clazz;
}
public T createNewAnimal()
{
T animal = clazz.newInstance();
animals.add(animal);
return animal
}
}
Zoo<Tiger> zoo = new Zoo<Tiger>(Tiger.class); // вот тут передается тип!
Tiger tiger = zoo.createNewAnimal();
To nie jest mega-przebiegła kombinacja - po prostu przekazujemy odniesienie do pożądanego typu. Ale gdybyśmy po prostu użyli Class zamiast Class<T>, to ktoś mógłby omyłkowo przekazać tam dwa różne typy - jeden jako parametr T, a drugi do konstruktora.
- Tak. Zrozumieć. Nie wydarzyło się nic nadprzyrodzonego, nic strasznego też. Istnieje link do typu, możesz go użyć, działa dobrze.
- Tutaj słyszę słowa "nie chłopiec, tylko mąż!" Działa dobrze - często jest to najlepsza opcja.
Wiele rzeczy można teraz przerobić w Javie, ale trzeba zachować kompatybilność ze starym kodem.
To właśnie dziesiątki tysięcy popularnych debugowanych bibliotek są dziś najpoważniejszym argumentem przemawiającym za Javą. Tak więc, przy zachowaniu kompatybilności wstecznej, Java pozostaje najpopularniejszym językiem i dlatego nie może wprowadzać radykalnych innowacji.
— A ja zrobię sobie Javę z blackjackiem i...
- Dobra, jestem już zmęczony całym dniem. pożegnajmy się.
Żegnaj Risza i dzięki za tak ciekawą lekcję.
GO TO FULL VERSION