В Java я могу использовать литерал примитивного типа или переменную типа в экземпляре instanceof? - PullRequest
2 голосов
/ 31 января 2011

Можно ли использовать литерал примитивного типа или переменную типа в выражении instanceof?

class MyClass<T> {
    {
         boolean b1 = null instanceof T; // T erasure -> Object should be used
         boolean b2 = 2 instanceof Integer; // Incompatible operands
    }

Я получаю ошибки компиляции. Есть ли способ обойти эти ошибки и использовать переменную литерала / типа примитивного типа в instanceof выражении?

По сути, я хочу быть уверен, что нет, я никогда не смогу это сделать.

Ответы [ 4 ]

5 голосов
/ 31 января 2011

Нет, из-за стирания типа . Экземпляр MyClass<T> на самом деле не знает, что такое T.

Вам нужно иметь экземпляр Class<T>. Тогда вы можете использовать метод isInstance. Один из способов сделать это - указать это в конструкторе:

class MyClass<T>
{
    private Class<T> clazz;

    MyClass(Class<T> clazz)
    {
        this.clazz = clazz;
    }

    // Now you can use clazz to check for instances, create new instances ect.
}

Во втором случае проблема заключается в первом операнде, а не во втором. Само примитивное значение не является экземпляром Integer; коробочная версия:

Object obj = 2;
boolean b2 = obj instanceof Integer;

Всякий раз, когда у вас есть подлинное примитивное значение, вы уже знаете тип, поэтому выполнение динамической проверки типов не имеет особого смысла.

2 голосов
/ 31 января 2011
  1. Из-за стирания типа вы не можете знать, что такое T.

  2. Литералы (кроме строковых литералов) не являются объектами.
    Следовательно, №

1 голос
/ 31 января 2011

По сути, instanceof запрашивает объект как левый операнд. Примитивные переменные не являются объектами, поэтому нет, вы не можете использовать это таким образом.

0 голосов
/ 31 января 2011
  1. Вы не можете сделать это.
  2. Даже если бы вы могли, вы не можете использовать его.

Типичное использование instanceof выглядит как

void somemethod(Collection c) {
    if (c instanceof List) {...}
}

somemethod(new ArrayList());

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

void anothermethod(double x) {
    .... // <------ X
}

anothermethod(42);

В точке X есть переменная x типа double, нет скрытой информации о некотором int 42. Фактический параметр 42 не маскируется как double, он получает , преобразованный в double. Вот почему instanceof не имеет смысла для примитивов.

...