fork download
  1. import java.util.*;
  2. import java.lang.*;
  3.  
  4. /* Name of the class has to be "Main" only if the class is public. */
  5. class Ideone {
  6. static <T> List<T>[] getArrayOfGenericObjects1(List<T>... a) {
  7. Object[] objectArray = a;
  8. objectArray[0] = new ArrayList<>(Arrays.asList(6, 7));
  9. // Ему вообще всё равно,
  10. T t = a[0].get(0);
  11. System.out.println(t.getClass());
  12. System.out.println(t);
  13. // что в себе хранить, потому что при type erasure T заменяется на Object
  14. t = a[1].get(0);
  15. System.out.println(t.getClass());
  16. System.out.println(t);
  17. return a;
  18. }
  19.  
  20. static List<String>[] getArrayOfGenericObjects2(List<String>... a) {
  21. Object[] objectArray = a;
  22. objectArray[0] = new ArrayList<>(Arrays.asList(1, 2));
  23. // Вот тут справедливо возникает ClassCastException
  24. // String s = a[0].get(0);
  25. return a;
  26. }
  27.  
  28. public static void main (String[] args) throws java.lang.Exception
  29. {
  30. List<String>[] arrayOfStringLists = getArrayOfGenericObjects2(
  31. new ArrayList<>(Arrays.asList("1", "2")),
  32. new ArrayList<>(Arrays.asList("3", "4", "5"))
  33. );
  34.  
  35. arrayOfStringLists = getArrayOfGenericObjects1(
  36. new ArrayList<>(Arrays.asList("1", "2")),
  37. new ArrayList<>(Arrays.asList("3", "4", "5"))
  38. );
  39. List<String> stringList = arrayOfStringLists[0];
  40. // Но вот тут это ClassCastException
  41. String s = stringList.get(0);
  42. }
  43. }
Runtime error #stdin #stdout #stderr 0.06s 32512KB
stdin
Standard input is empty
stdout
class java.lang.Integer
6
class java.lang.String
3
stderr
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
	at Ideone.main(Main.java:41)