#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]);