Чи є щось на зразок 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.