Ответ 1
Ну, я озадачен этим, и единственным объяснением, которое я могу приключить, является соединение двух вещей.
1_ getClass()
docs сказать следующее:
Фактический тип результата
Class<? extends |X|>
, где|X|
- это стирание статического типа выражения, на которомgetClass
называется.
2_ Одна из несовместимости, введенная в Java 7, Компилятор больше не разрешает доступ к частным членам переменных типа.
Таким образом, компилятор не уверен, что приведение производится к базовому классу или подклассу, и он блокирует доступ к закрытому члену, поскольку, если приведение должно быть назначено подклассу, оно было бы незаконным, даже если оно определено в оригинале родительский класс, как показано в следующем примере:
class BaseTest {
private final int i = 1;
void test(Object o) {
if (getClass().isInstance(o)) {
TestAccess to = TestAccess.class.cast(o);
//System.out.println(to.i); // ERROR: i has private access in BaseTest
}
}
}
class TestAccess extends BaseTest{}
Итак, я предполагаю, что это еще один из причуд Java из-за правил, которые имеют больше смысла в более сложных примерах.