2013-11-25 4 views
5

Согласно Class.getSuperclass() documentation:Почему Class.getSuperclass() иногда возвращает Object.class?

Возвращает класс, представляющий суперкласс субъекта (класса, интерфейса, примитивный типа или пустота), представленный этот класс. Если этот класс представляет либо класс Object, интерфейс, примитивный тип , либо void, то возвращается null.

Но я иногда видя Object.class возвращается (с использованием jdk1.7.0_45) - так я приходится проверять его отдельно:

final Class<?> superclass = modelClass.getSuperclass(); 
if ((superclass != null) && (Object.class != superclass)) { 
    // Do stuff with superclasses other than Object. 
} 

Является ли это Java ошибка? Есть ли лучший способ проверить, superclass является Object?

+0

В вашем сценарии все является «экземпляром» объекта «Объект». Что вы пытаетесь достичь? –

+0

Я не буду вдаваться в подробности, но отражение используется для прокрутки всех методов класса и рекурсивно всех его предков, кроме Object. –

+0

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

ответ

7

В документации указано, что если ваш класс java.lang.Object, то его getSuperclass собирается вернуть null. Другими словами, если вы сделаете это

Class objSuper = Object.class.getSuperclass(); 

тогда objSuper будет null; это именно то, что происходит (demo).

Оказывается, однако, что ваш modelClass является неjava.lang.Object, и это также не является примитивным или интерфейс. Поэтому возвращение java.lang.Object имеет смысл, потому что все классы неявно наследуют его.

+0

А теперь я понимаю. Добавили первое предложение документации к вопросу. В этом предложении есть два «класса», и я ошибочно думал, что второе предложение думает, что это относится к первому, а не к второму. Спасибо, что поняли это. –

1

Этот класс в документации относится к вызывающему абоненту метода getSuperclass(), насколько я понимаю.

Так что, если вызывающий абонент либо является классом Object, либо примитивным типом/интерфейсом, то вернувшийся суперкласс будет null, что на мой взгляд является полным.

1

Если вам нужно узнать, если Object является прямого родитель вашего класса, вы можете использовать

System.out.println(YourObject.class.getSuperclass() == Object.class); 

В противном случае вы должны знать, что в конце каждый объект наследует Object класса. Вместо Object класс сам, поэтому .getSuperclass() вернется null.

+0

Спасибо, я искал это. : D – DoombringerBG

Смежные вопросы