Create type array java

Creating Generic Array in Java

An array is used to store a collection of similar types of data. Creating a generic array in Java could be a little complex. Arrays use the type information of their elements at runtime for memory allocation. But in the case of generics, this information is not available due to type erasure.

Generics check for type information at the compile time, and no information is available at runtime.

For arrays, the type information is checked at runtime because they are covariant. It means that we can assign a child-type array to a parent type(like String[] to Object[]).

String[] strArr = new String[5]; Object[] objArr = strArr; //No Error

The above code will not return any compile-time error. We can also add different objects to the above array without worrying about any compilation errors. But type-checking for all elements takes place at runtime for arrays. If any discrepancies are found at runtime, then we will get an ArrayStoreException .

Exception in thread «main» java.lang.ArrayStoreException: java.lang.Object
at Demo.main(Demo.java:7)

It is recommended to use Collection Frameworks like the List instead of generic arrays. However, we can create a generic array if we have some information about the type at compile time. Let’s learn how to create a generic array in Java.

Creating a Generic Array Using Object Array

We can create a generic class with an Object array to mimic a generic array. We will use a get() method and a set() method in this class. The get() method will use an explicit cast.

import java.util.Arrays; class GenericArray  < private Object[] genericArr; GenericArray(int size) < genericArr = new Object[size]; >public T get(int index) < return (T) genericArr[index]; >public void set(int index, T element) < genericArr[index] = element; >@Override public String toString() < return Arrays.toString(genericArr); >> public class Demo < public static void main(String[] args) < GenericArraystrArr = new GenericArray(3); strArr.set(0, "five"); strArr.set(1, "ten"); strArr.set(2, "twenty"); GenericArray intArr = new GenericArray(3); intArr.set(0, 5); intArr.set(1, 10); intArr.set(2, 20); GenericArray doubleArr = new GenericArray(3); doubleArr.set(0, 5.0); doubleArr.set(1, 10.0); doubleArr.set(2, 20.0); System.out.println("Integer Array: " + intArr); System.out.println("String Array: " + strArr); System.out.println("Double Array: " + doubleArr); > >

Integer Array: [5, 10, 20]
String Array: [five, ten, twenty]
Double Array: [5.0, 10.0, 20.0]

Читайте также:  Postgresql подключиться через python

The above approach works fine if we only use the get() and set() methods and do not provide users with direct access to the object array. A thing to note here is that even the ArrayList uses an object array to store elements. ArrayLists do not give direct access to this object array.

Creating a Generic Array Using Reflection

This approach is similar to the one discussed in the previous section. The only difference is that the constructor will take the type information, and then we will use the Array.newInstance() method to initialize our array. The complete implementation is shown below.

import java.lang.reflect.Array; import java.util.Arrays; class GenericArray  < private T[] genericArr; GenericArray(ClassclassType, int size) < genericArr = (T[]) Array.newInstance(classType, size); >public T get(int index) < return genericArr[index]; >public void set(int index, T element) < genericArr[index] = element; >@Override public String toString() < return Arrays.toString(genericArr); >> public class Demo < public static void main(String[] args) < GenericArraystrArr = new GenericArray(String.class, 3); strArr.set(0, "five"); strArr.set(1, "ten"); strArr.set(2, "twenty"); GenericArray intArr = new GenericArray(Integer.class, 3); intArr.set(0, 5); intArr.set(1, 10); intArr.set(2, 20); GenericArray doubleArr = new GenericArray(Double.class, 3); doubleArr.set(0, 5.0); doubleArr.set(1, 10.0); doubleArr.set(2, 20.0); System.out.println("Integer Array: " + intArr); System.out.println("String Array: " + strArr); System.out.println("Double Array: " + doubleArr); > >

Integer Array: [5, 10, 20]
String Array: [five, ten, twenty]
Double Array: [5.0, 10.0, 20.0]

Summary

We can implement generic arrays in Java with the help of generic classes. We can use an Object array and appropriate methods for the user to interact with this generic array. The concept of an object array is also used by the ArrayList class. We can also use the Array.newInstance() method and make the user pass the type information to the constructor. A similar approach is used by generic methods of some Collections like the LinkedList. Overall, it is recommended to use ArrayLists or LinkedList in place of creating our own generic lists.

Источник

Создание универсального массива в Java

Создание универсального массива в Java

  1. Использование массивов объектов для создания универсальных массивов в Java
  2. Используйте класс отражения для создания универсальных массивов в Java

Массив можно определить как набор элементов, хранящихся в непрерывных ячейках памяти. Универсальный массив не зависит от какого-либо типа данных и чей тип информации оценивается во время выполнения.

Однако Java не допускает, чтобы массив был универсальным, потому что в Java массивы содержат информацию, связанную с их компонентами, и эта информация во время выполнения используется для выделения памяти.

Мы можем моделировать общие структуры, похожие на массивы, используя массив объектов и функцию класса отражения в Java. Мы обсудим эти методы ниже.

Использование массивов объектов для создания универсальных массивов в Java

В этом подходе используется массив объектов типа в качестве члена. Мы используем функции get() и set() для чтения и установки элементов массива.

Следующая программа демонстрирует использование массива объектов для создания универсального массива.

import java.util.Arrays;  class Generic_ArrayE>   private final Object[] obj_array; //object array  public final int length;  // class constructor  public Generic_Array(int len)   //new object array  obj_array = new Object [len];  this.len = len;  >  // get new object array(obj_array[i])  E get(int j)   @SuppressWarnings("unchecked")  final E e = (E)object_array[j];  return e;  >  // set e at new object array(obj_array[i])  void set(int j, E e)   object_array[j] = e;  >  @Override  public String toString()   return Arrays.toString(object_array);  > > class Main   public static void main(String[] args)  final int len = 5;  // creating an integer array  Generic_ArrayInteger>int_Array = new Generic_Array(len);  System.out.print("Generic Array :" + " ");  for (int i = 2; i  len; i++)  int_Array.set(i, i * 2);  System.out.println(int_Array);  // creating a string array  Generic_ArrayString>str_Array = new Generic_Array(len);  System.out.print("Generic Array :" + " ");  for (int i = 0; i  len; i++)  str_Array.set(i, String.valueOf((char)(i + 97)));  System.out.println(str_Array);  > > 
Generic Array : [2, 4, 6, 8, 10] Generic Array : [a, b, c, d, e] 

Используйте класс отражения для создания универсальных массивов в Java

В этом типе подхода класс отражения используется для создания универсального массива, тип которого будет известен только во время выполнения.

Единственное различие между предыдущим подходом и этим подходом состоит в том, что класс отражения используется как сам конструктор. После этого класс отражения инициирует массив объектов, явно передавая данные классу конструктора.

Следующая программа демонстрирует использование отражения для создания универсального массива.

import java.util.Arrays; class Generic_ArrayE>   private final E[] objArray;  public final int length;  //constructor class  public Generic_Array(ClassE>dataType, int length)  // creatting a new array with the specified data type and length at runtime using reflection method.  this.objArray = (E[]) java.lang.reflect.Array.newInstance(dataType, len);  this.len = len;  >  // get element at obj_Array[i]  E get(int i)   return obj_Array[i];  >  // assign e to obj_Array[i]  void set(int i, E e)   obj_Array[i] = e;  >  @Override  public String toString()   return Arrays.toString(obj_Array);  > > class Main   public static void main(String[] args)  final int len = 5;  // create array with Integer as data type  Generic_ArrayInteger>int_Array = new Generic_Array(Integer.class, len);  System.out.print("Generic Array:" + " ");  for (int i = 2; i  len; i++)  int_Array.set(i, i + 10);  System.out.println(int_Array);  // create an array with String as data type  Generic_ArrayString>str_Array = new Generic_Array(String.class, len);  System.out.print("Generic Array:" + " ");  for (int i = 0; i  len; i++)  str_Array.set(i, String.valueOf((char)(i + 65)));  System.out.println(str_Array);  > > 
Generic Array: [12, 13, 14, 15, 16] Generic Array: [A, B, C, D, E] 

Универсальный массив не может обеспечить безопасность типа, если не реализована проверка типа или явный механизм, поскольку универсальные классы неизвестны для того типа аргумента, который они создали во время выполнения.

Если мы хотим получить точный массив без какой-либо безопасности, о которой говорилось выше, с использованием дженериков, это можно сделать, как показано ниже.

import java.lang.reflect.Array;  public class Gen_SetE>   private E[] x;   public Gen_Set(ClassE[]> cla, int len)   x = cla.cast(Array.newInstance(cla.getComponentType(), len));  >   public static void main(String[] args)   Gen_SetString> foo = new Gen_SetString>(String[].class, 1);  String[] bar = foo.x;  foo.x[0] = "xyzzy";  String baz = foo.a[0];  > > 

Этот код не будет выдавать предупреждений во время компиляции, и мы видим, что в основном классе тип объявленного экземпляра Gen_Set может быть назначен одинаково для x массива этого типа, что означает как массив, так и значения массива являются неверными типами.

Сопутствующая статья — Java Array

Copyright © 2023. All right reserved

Источник

Оцените статью