Рубрики
Без рубрики

Концепция Java на сегодняшний день.

Концепция на сегодняшний день – это дженерики Java. Это продолжение серии Java-концепций ORI… С тегами java, информатика, начинающие, карьера.

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