Java: Почему необходимо приведение типа для InstanceOf () в равных ()? Является ли это для справки или меньше коды?

голоса
0

Java новичок здесь, у меня есть основной вопрос, который наполовину ответили предыдущими ответами в других потоках или документы, но я до сих пор не в полной мере понять механизм, и я хочу быть уверен, что охватывает основы (код на нижней части, вопросы средний).

В принципе, я переопределение () метод равных , чтобы проверить , если два объекта MyDate имеет ту же дату. Я делаю проверку InstanceOf если о объекте является объектом MyDate, то приведением типа объекта временного конкретно к объекту MyDate o, то вы сравните даты. Почему вы вводите привести переменную временную к MyDate классу о, когда он уже имеет класс MyDate?

  1. Используете ли вы переменный временную как проще ссылки на объект , который вы хотите запустить Равные) сравнение (? Поскольку вы используете Equals () в качестве сравнения MyDate.equals(MyOtherDate), в коде , если я не назначить переменную для ссылки , то вы получите различные ошибки (температура не может быть разрешен в переменной типа несоответствия, и т.д. в основном компилятор не уверен , где чтобы выглядеть , если вы не написать больше кода сгустка).

2а. Некоторые из других нитей сказали что - то о том , что в то время как InstanceOf проверки , если экземпляр из класса, он проверяет базовый класс, но не проверяет подкласс. Вы делаете типажи , потому что вы определенно говорите компилятору , чтобы проверить , что конкретный объект (типа отливку из общего объекта к конкретному объекту). Примечание: Это может быть вариантом и вкус специфического типа вопрос, я видел разные ответы на подобные вопросы.

2b. Кастинг меняет ссылку, а не сам объект. Таким образом, если объекты из того же класса, но разные подклассы, были бы не он не в состоянии во время выполнения, а не компиляции. И я бы не получить ClassCastException?

public boolean equals(Object o) {
            if (o instanceof MyDate) {
                MyDate temp = (MyDate) o;
                if ((temp.day == day) && (temp.month == month) && (temp.year == year)) {
                    return true;
                }
            } 
            return false;
        }
Задан 13/01/2020 в 22:01
источник пользователем
На других языках...                            


2 ответов

голоса
0

Компилятор Java не понимает класс типа вашего объекта «O» как MyDate. Это произойдет потому , что вы получили параметр типа Object , так что будет читаться как объект. Для того , чтобы получить доступ к методам и свойствам параметра известного типа MyDate, вам необходимо сообщить компилятору , что это объект типа MyDate. Это путь компилятор будет понимать , что вы делаете. Теперь давайте взглянем на другой вид зрения.

Каждые типы в Java расширяет тип , Objectкоторый означает , что каждый раз , когда вы пишете класс, вы неявно расширяя Objectобщественные / защищенные свойства и поведение. Вот почему вы «переопределяете» метод , equalsкоторый относится к Objectтипу. Хорошо, когда вы делаете сравнение между двумя объектами , вы должны сначала проверить , если оба они принадлежат к тому же типу, как вы делали в вашем примере с: if (o instanceof MyDate) { ... }чтобы убедиться , что oэто типа MyDate. Но в этот момент, как вы не бросили «о» на «MyDate» типа вы не сможете свойства конкретного MyDate доступа или методы. Так что подумайте об этом на некоторое время, если у меня есть класс , Aкоторый расширяет мой класс , Bя буду в состоянии методов общественного доступа B и свойства внутри, но я не могу сделать то же самое на B , потому что B не может видеть , что происходит вниз дерево. Вы следуете?

Надеюсь, что я мог бы ответить на ваши сомнения.

Ответил 13/01/2020 в 22:16
источник пользователем

голоса
2

Java имеет два взаимосвязанных, но отделенное понятие: тип А.Н. выражения , а также во время выполнения типа в виде значения .

Эти понятия совместимы в некоторой степени; если выражение имеет тип MyDate, то когда вы вычислите это выражение, вы либо получите ссылку на объект, среда типа либо MyDateили подкласс MyDate, или вы получите ссылку нулевой, или вы получите исключение или бесконечный цикл или этажерку. Но понятия разделены, и даже тогда , когда ваши время выполнения типы-это хорошо, иногда нужно дать компилятору некоторую дополнительную информацию о типах.

> Почему вы вводите отливать переменную временную к MyDate классу о, когда он уже имеет класс MyDate?

Переменная oимеет тип Object, а не когда - либо типа MyDate. Это происходит , чтобы содержать ссылку на объект, среда выполнения-тип MyDate(или подкласс MyDate), но это не влияет на тип o. Так вы пишете , (MyDate)oчтобы создать выражение с тем же значением (и , следовательно , та же среда типа) и требуемого типа.

Если компилятор умнее, это может возможно рассматривать oкак имеющие тип MyDateвнутри if-statement, так что вам не нужно будет бросок; но в настоящее время спецификация языка Java не позволяет этого. (А если это так, что может иметь некоторые странные последствия , когда речь идет о статическом методе отправки.)

Ответил 13/01/2020 в 22:21
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more