Ошибка времени компиляции и выполнения

#java

#java

Вопрос:

 class Dims {
    public static void main(String[] args) {
        int[][] a = {{1,2,}, {3,4}};
        int[] b = (int[]) a[1];
        Object o1 = a;
        int[][] a2 = (int[][]) o1;
        int[] b2 = (int[]) o1;   // Line 7
        System.out.println(b[1]);
    } 
}  
  

У меня есть сомнения в приведенном выше фрагменте кода на Java.
Почему это выдает исключение во время выполнения, а не ошибку во время компиляции в строке под номером 7?

Комментарии:

1. У вас есть вопрос или в вашем домашнем задании есть вопрос?

2. Это один из вопросов в книге по Java, которую я читаю. В книге также есть решения.

Ответ №1:

Потому что o1 — это int[][], а не int[] . Получаемое вами исключение RuntimeException является ClassCastException, потому что первое представляет собой массив массивов int, а второе — просто массив целых чисел.

Вы не получаете ошибку времени компиляции, потому что o1 определен как объект. Таким образом, во время компиляции он может содержать все, что является производным от object , который фактически является любым типом в Java, за исключением примитивных типов long, int, short, byte, char, double, float и boolean. Итак, во время компиляции кажется возможным, что объект на самом деле может быть int[] .

Ответ №2:

Вы не можете просто преобразовать двумерный массив в одномерный массив путем приведения. Вам нужно каким-то образом скопировать значения в новый одномерный массив.

Ответ №3:

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

 int[][] a = {{1, 2,}, {3, 4}};
int[] b = a[1]; // no cast is used here and the compiler can tell this is valid.
Object o1 = a;
int[][] a2 = (int[][]) o1; // This cast is fine.
int[] b2 = (int[]) o1;   // My IDE warns this case may produce a ClassCastException.
System.out.println(b[1]);