Оператор instanceof в Java для сравнения различных классов

Я пытался понять, как работает оператор instanceof в Java, и столкнулся с очень странной проблемой.

public static void main(String[] args) {
    Map m = new HashMap();
    System.out.println("m instanceof Date: " + (m instanceof Date));
}

Выше возвращается ложь, как и ожидалось. Тем не мение,

public static void main(String[] args) {
    HashMap m = new HashMap();
    System.out.println("m instanceof Date: " + (m instanceof Date));
}

Это даже не компилируется. Я получаю ошибку

inconvertible types
found   : java.util.HashMap
required : java.util.Date

Что мне здесь не хватает? Я использую IntelliJ Idea 11.

Ответы на вопрос(4)

@Bon Espresso почти сказал правильный ответ, по моему мнению.

Вы должны понять, что на самом деле делает instanceof, таким образом, определение:

instanceof - это бинарный оператор, который проверяет, является лиэкземпляр имеет определенный тип

Итак, когда вы делаете это:

 Map m = new HashMap();

Во время компиляции м на самом делеинтерфейс, но фактический тест против instanceof происходит во время выполненияс экземпляром НЕ интерфейстаким образом, компилятор не может быть уверен, что экземпляр «позади» m (некоторый класс, который реализует этот интерфейс) на самом деле является классом, который может расширять Date.

Я имею в виду, что у вас может быть класс с такой декларацией:

class MyClass extends Date implements Map{
     .....
}

И тогда вы могли бы сделать это:

 Map myMap = new MyClass();
 (myMap instanceof Date) 

и это было бы совершенно законно, потому что MyClass фактически расширяет Date.

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

С другой стороны, во втором примере:

    HashMap m = new HashMap();

Вы объявляете фактическую реализацию интерфейса Map илиэкземпляр, В этом случае компилятор уверен, что HashMap не расширяет Date, поэтому выдает ошибку.

 Ankit Dhingra03 февр. 2012 г., 08:48
Полностью согласен ... понял, что когда я попробовал то же самое в компиляторе ... должен сказать, что вы написали это очень элегантно :)
 Eugene03 февр. 2012 г., 08:52
@AnkitDhingra эй, спасибо! Очень лестно. нет голосов, хотя, может быть в следующий раз :) Ура!

Вы объявляетеMap m и использоватьinstanceof потому чтоMap являетсяinterface который новый класс можетextends Date implements Map, Другой (не Date) абстрактный класс или класс вызывают ошибку компиляции.

public static void main(String[] args) {
    Map m = new HashMap();
    System.out.println("m instanceof Date: " + (m instanceof Date));
}
Решение Вопроса

Если приведение выражения RelationalExpression к ReferenceType будет отклонено как ошибка во время компиляции, то реляционное выражение instanceof также вызывает ошибку во время компиляции. В такой ситуации результат выражения instanceof никогда не может быть истинным.

Поскольку вы не можете составить актерский состав изHashMap кDateВы не можете скомпилироватьinstanceof тест между двумя либо.

Ваш ответ на вопрос