Чи є щось на зразок instanceOf (Class <?> C) в Java?


87

Я хочу перевірити, чи є об'єкт oекземпляром класу Cабо підкласу C.

Наприклад, якщо pце клас, Pointя хочу x.instanceOf(Point.class)бути, trueа також x.instanceOf(Object.class)бути true.

Я хочу, щоб це працювало також для примітивних типів в коробці. Наприклад, якщо xє, Integerтоді x.instanceOf(Integer.class)має бути true.

Чи є така річ? Якщо ні, як я можу застосувати такий метод?


обробляти заняття в
боксах

Відповіді:


172

Class.isInstance робить те, що ви хочете.

if (Point.class.isInstance(someObj)){
    ...
}

Звичайно, ви не повинні використовувати його, якщо б могли instanceofзамість цього, але для сценаріїв роздумів це часто стає в нагоді.


6
@Ahamed, напевно це повільніше, але що ще гірше, це важче зрозуміти! Якщо є дуже простий спосіб зробити щось подібне if (a instanceof Point)- але ви робите це більш заплутано, той, хто читає код, обов’язково подумає: "о, у цього повинна бути причина, що робиться важким способом", і потім перейдіть до документів, щоб дізнатись, чим Class.isInstanceвідрізняється від instanceof. Ви витрачаєте час своїх колег.
gustafc

21

Я хочу перевірити, чи об'єкт o є екземпляром класу c або підкласом c. Наприклад, якщо p класу Point, я хочу x.instanceOf (Point.class)

Гм ... Що? Що таке о, р і х?

Я хочу, щоб це працювало також для примітивних типів. Наприклад, якщо x є цілим числом, тоді x.instanceOf (Integer.class), а також x.instanceOf (Object.class) має бути істинним.

Ні. Це навіть не слід компілювати. Примітиви не є об'єктами, і ви не можете викликати методи на них.

У будь-якому випадку, є три речі, одна з яких напевно може досягти бажаного (вони дещо відрізняються в тому, де саме застосовувати:

  • instanceofОператором , якщо ви знаєте , клас під час компіляції.
  • Class.isInstance (), якщо ви хочете перевірити клас об’єкта щодо класу, невідомого під час компіляції.
  • Class.isAssignableFrom (), якщо ви хочете перевірити присвоєність даним двох об'єктів класу.

9
x instanceof Integer
x instanceof Object

вам просто потрібно використовувати правильний синтаксис

для примітивних типів ви повинні робити це зовсім по-іншому. Оскільки ви не можете створити для них методи, вам потрібен клас, який зберігає метод. Отже, замість "x.instanceOf (Integer.Class)", вам потрібно викликати "MyClassComparer.instanceOf (x, Integer.Class)" або щось подібне. Це можна було б легко реалізувати методами перевантаження, але я не бачу випадку, коли ця функціональність взагалі була б бажаною.


4

Насправді в Java існує логічний оператор, який називається instanceof, за допомогою якого можна визначити, чи є об'єкт екземпляром класу, екземпляром підкласу чи екземпляром класу, який реалізує певний інтерфейс.

if(obj instanceof SomeClass) {
    // Do something
}

Навчальний посібник Java має хороший приклад цього оператора


1
ви не можете використовувати instanceof з примітивними типами
dfa

4
Він плутав примітивні типи з предметами. Будь ласка, прочитайте ... "Наприклад, якщо x є цілим числом, тоді x.instanceOf (Integer.class), а також x.instanceOf (Object.class) має бути істинним." Ганьба тому, що ви не голосуєте за всі відповіді
victor hugo

Відправлення (sp) пропозиції щодо використання підручника Java. Це хороший довідник для вивчення самої мови.
luis.espinal

0

Ви можете зробити:

if (foo instanceof classNameYouWantToCheck) 

ви не можете використовувати instanceof з примітивними типами
dfa

Клас мав лише показати, що він повинен написати там назву класу. Я
виправлю

0

"Я хочу, щоб це працювало також для примітивних типів. Наприклад, якщо x є цілим числом, тоді x.instanceOf (Integer.class), а також x.instanceOf (Object.class) повинні бути істинними."

Чому? Первісні типи та еталонні типи абсолютно відокремлені. Примітивний int не є підтипом Integer або Object. Тип примітивного значення завжди відомий статично під час компіляції, тому немає сенсу перевіряти його тип. Звичайно, ви можете встановити примітивне значення, а потім перевірити його тип:

(Integer)5 instanceof Integer

Але в чому б сенс?


-2

Я думаю, вас бентежить примірник instance для сирих об’єктів та загальних

obj instanceof Class
obj instanceof Class<?> // this is the one you want

2
Ви не можете використовувати узагальнені засоби праворуч від оператора instanceof через стирання типу.
Маттіас

2
Ні, це ви, хто збентежений у цьому. Ви повинні використовувати сирий тип після instanceof.
Dawood ibn Kareem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.