Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

А знаете ли Вы, что возвращает .getClass()?

Anna | 4.06.2014 | нет комментариев
Я думаю, примерно всякого Java разработчика когда-то спрашивали на собеседовании: «Какие есть способы у класса Object?»
Меня, по крайней мере, спрашивали многократно. И, если в 1-й раз это было неожиданностью (кажется, позабыл про clone), то потом я был уверен, что уж способы Object’а-то я знаю;)

И каково же было мое изумление, когда через несколько лет разработки я наткнулся на собственное незнаниесигнатуры способа getClass()

Под катом пара слов про Class, .class, .getClass и, собственно, сюрприз, на тот, что я наткнулся.

Выходит, у нас есть класс А и объект этого класса a:

public class A {
}
...
A a = new A();

0. A.class vs a.getClass()

Начнем с простого. При вызове getClass() может отработать полиморфизм, и итогом будет класс-потомок.

public class B extends A {
{
...

A a1 = new B();
a1.getClass(); // то же самое, что B.class
Спрятанный текст

Здесь была вранье, на которую мне указали в комментариях. class — это не статическое поле, коим может показаться (и даже не нативное-псевдо-статическое поле, как думал я), а специальная конструкция языка. И, в различие от статического поля, обратиться к нему через объект невозможно!

a.class; // Compile error! Unknown class: "a"

Но это так, цветочки. Идем дальше.

1. А что такое данный ваш Class?

A.class — объект класса Class. Глядим в Class.java:

public final class Class<T> implements ...

Это дженерик. Причем типизирован он, видимо, этим самым A — классом, у которого вызвали .class

Если подумать, то ясно для чего это необходимо: сейчас, в частности, дозволено написать способ, тот, что возвращает произвольный тип, в зависимости от довода:

public <T> T foo(Class<T> clazz);

A.class возвращает объект класса Class:

Class<A> result = A.class; // Compilation successfull

2. А что же возвращает a.getClass()?

Собрав вместе все вышесказанное, дозволено додуматься, что:

Class<A> result1 = a.getClass(); // Compilation error!

Подлинно, ввиду полиморфизма необходимо не забывать, что фактический класс объекта a — не непременно A — это может быть всякий подкласс:

Class<? extends A> result = a.getClass(); // Compilation successfull

3. А что же написано в Object.java?

Все эти дженерики — это, безусловно, восхитительно, но как записать сигнатуру способа getClass синтаксисом java в классе Object?
А никак:

public final native Class<?> getClass();

А на вопрос, отчего не компилировался пример выше, ответит Максим Поташев джавадок к способу:

The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called.

Так что в Object.java написана одна сигнатура, а компилятор подставляет иную.

 Источник: programmingmaster.ru
Оставить комментарий
БАЗА ЗНАНИЙ
СЛУЧАЙНАЯ СТАТЬЯ
СЛУЧАЙНЫЙ БЛОГ
СЛУЧАЙНЫЙ МОД
СЛУЧАЙНЫЙ СКИН
НОВЫЕ МОДЫ
НОВЫЕ СКИНЫ
НАКОПЛЕННЫЙ ОПЫТ
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB