天天看點

Java - generic

The advantages of using generics means that the compiler checks that only strings are added to the list which makes the code safer.

List names = new ArrayList();
names.add("Bill");
String name = (String)names.get(0);
System.out.println("First name:" + name);

List<String> names2 = new ArrayList();
names2.add("Bill");
String name2 = names2.get(0);
System.out.println("First name:" + name2);      

Further advantage comes when access more elements in the list, without generics, every single object need to cast to a string. With generics, only need to specify the type once when create the list.

In Java, object is a parent type of all other object types. Using objects means that lose type safety. 

Demo

static Character[] charArray = {'b', 'i', 'l', 'l'};
static Integer[] intArray = {1, 2, 3, 4, 5};

public static void main(String[] args) {
  List<Character> charList = arrayToList(charArray, new ArrayList<>());
  List<Integer> intList = arrayToList(intArray, new ArrayList<>());

  System.out.println(intList.get(0));
}

public static List arrayToList(Object[] array, List<Object> list) {
  for (Object object: array) {
    list.add(object);
  }

  return list;
}      

控制台輸入出結果:

1      

如果修改代碼,List<String> intList,這樣就會出錯。

static Character[] charArray = {'b', 'i', 'l', 'l'};
static Integer[] intArray = {1, 2, 3, 4, 5};

public static void main(String[] args) {
  List<Character> charList = arrayToList(charArray, new ArrayList<>());
  List<String> intList = arrayToList(intArray, new ArrayList<>());

  System.out.println(intList.get(0));
}

public static List arrayToList(Object[] array, List<Object> list) {
  for (Object object: array) {
    list.add(object);
  }

  return list;
}      

控制台輸入出結果:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String      
static Character[] charArray = {'b', 'i', 'l', 'l'};
static Integer[] intArray = {1, 2, 3, 4, 5};

public static void main(String[] args) {
  List<Character> charList = arrayToList(charArray, new ArrayList<>());
  List<Integer> intList = arrayToList(intArray, new ArrayList<>());

  System.out.println(intList.get(0));
}

public static<T> List<T> arrayToList(T[] array, List<T> list) {
  for (T object: array) {
    list.add(object);
  }

  return list;
}