Это продолжение серии ОРИГИНАЛЬНЫХ концепций 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) {
container container =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”