Это продолжение серии ОРИГИНАЛЬНЫХ концепций Java
Теперь, прежде чем мы начнем, позвольте мне сказать вам, что концепция Java Generics будет рассмотрена в двух частях
часть 1 – Введение и основы.
часть 2 – Продвинутая генетика.
Прежде всего:
Что такое дженерики?
ну, как программист java, вы, возможно, много раз замечали использование угловых скобок <> в программах java, в основном, в коллекциях (ArrayList, Set,Map) и т. Д.
Всякий раз, когда вы видите <> , это означает, что здесь использовались дженерики.
Дженерики на Java были представлены в JSE 5.0(2004)
Если вы программист на Java, то приведение типов – одна из тех вещей, которые могут раздражать вас больше всего. Универсальные Java-приложения расширяют систему типов Java, позволяя “типу или методу работать с объектами различных типов, обеспечивая при этом безопасность типов во время компиляции”. Дженерики были введены, чтобы уменьшить боль от постоянной типизации переменных, чтобы заставить их работать правильно.
Давайте начнем с простого примера Java:
package generics; public class container { String item1; String item2; public container(String item1, String item2) { this.item1 = item1; this.item2 = item2; } public void print() { System.out.println("container contains: "); System.out.println(item1); System.out.println(item2); } }
На этом этапе класс контейнера может работать только со строковыми типами данных.
package generics; public class app { public static void main(String[] args) { container container =new container("java","23");//only string can be passed as a parameter container.print(); } }
Что, если бы мы хотели, чтобы этот класс работал с любым типом данных (int, double boolean и т. Д.). Для этого мы можем изменить тип строки на тип объекта ( Потому что каждый класс является дочерним классом класса объектов в Java )
Таким образом, мы можем изменить код следующим образом:
package generics; public class container { Object item1; Object item2; public container(Object item1, Object item2) { this.item1 = item1; this.item2 = item2; } public void print() { System.out.println("container contains: "); System.out.println(item1); System.out.println(item2); } }
Теперь мы сделали этот класс своего рода “универсальным”, т.Е. Нам не нужно беспокоиться о типизации наших переменных в строку перед их передачей.
package generics; public class app { public static void main(String[] args) { container container =new container(false,23); container.print(); } }
Следовательно, мы просто передали int и логическое значение, и это сработало безупречно!
Но подождите, в этом есть проблема.
Давайте представим некоторые методы получения в нашем классе контейнеров (ярлык для этого – alt+вставка).
package generics; public class container { Object item1; Object item2; public container(Object item1, Object item2) { this.item1 = item1; this.item2 = item2; } public Object getItem1() { return item1; } public Object getItem2() { return item2; } public void print() { System.out.println("container contains: "); System.out.println(item1); System.out.println(item2); } }
Теперь давайте попробуем получить item1 и item2 из нашего app.java класс.
package generics; public class app { public static void main(String[] args) { container container =new container(false,23); container.print(); boolean a= container.getItem1(); //compile error int b=container.getItem2();//compile error } }
Мы получаем ошибку компиляции, в которой говорится: приведение требуется для boolean и int. Чтобы решить эту проблему, мы должны снова привести их к логическому и int.
package generics; public class app { public static void main(String[] args) { container container =new container(false,23); container.print(); boolean a= (boolean) container.getItem1();//compiled successfully int b= (int) container.getItem2();//compiled successfully } }
Таким образом, нам все равно пришлось его типизировать, потому что класс контейнера возвращает объект, в то время как мы собираем его в переменной boolean/int.
Помните, что логическая переменная/int не может неявно принимать объектную переменную, но объектная переменная может принимать и другой тип данных. появятся подобные ошибки : ошибка: несовместимые типы:
Так что наш класс до сих пор не является универсальным. Давайте сделаем его универсальным:
package generics; public class container{ i1 item1; i2 item2; public container(i1 item1, i2 item2) { this.item1 = item1; this.item2 = item2; } public i1 getItem1() { return item1; } public i2 getItem2() { return item2; } public void print() { System.out.println("container contains: "); System.out.println(item1); System.out.println(item2); } }
“i1, i2” определяются пользователем (вы можете использовать любые имена). Итак, в основном теперь мы сделали возможным, чтобы класс контейнера принимал любой объект (как того хочет пользователь).
А теперь давайте посмотрим на волшебство!
package generics; public class app { public static void main(String[] args) { containercontainer =new container (false,23); container.print(); boolean a= container.getItem1(); int b= container.getItem2(); container container2 =new container ("java",23); container2.print(); String a2=container2.getItem1(); int b2=container2.getItem2(); } }
Видите ли, мы создали два разных объекта одного и того же класса “контейнер”, но оба они передают разные типы данных в одни и те же функции
Это и есть истинное использование дженериков Java. для каждой переменной контейнера нам не нужно вводить ее в логическое значение/int. для каждой переменной контейнера 2 нам не нужно вводить ее в строку/int. Потому что дженерики java заботятся об этом.
Так что это все для Java Generics Часть1. Надеюсь, у вас есть базовое понимание того, как дженерики работают на базовом уровне. В части 2 мы гораздо глубже рассмотрим некоторые передовые концепции генетики.
Если вам понравилась эта статья, пожалуйста, оставьте сердечко. И дайте мне знать в комментариях, если у вас есть какие-либо предложения для меня.
Оригинал: “https://dev.to/the_unconventional_coder/java-concept-of-the-day-oec”