Когда переопределение равняется в Java, почему это не работает для использования параметра кроме Объекта?

В качестве решения я приведу лишь один пример, потому что это не сложно, и вы можете найти решение в документах . Просто перенеси эту ситуацию на свою.

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

const ELEMENT_DATA: PeriodicElement[] = [
    {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'},
    {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'},
];
data: PeriodicElement[] = ELEMENT_DATA;

displayedColumns: string[] = ['name', 'weight', 'symbol', 'position'];

columnsToDisplay: string[] = this.displayedColumns.slice(); //returns a copy of displayedColumns

Теперь вы можете использовать их в своем html-файле, как показано ниже:


        
{{column}} {{element[column]}}

В качестве примера вашего решения я добавлю кнопку в html-файл, чтобы инициировать удаление последнего столбца: (аналогично сортировке в некотором роде)


Теперь нам просто нужно удалить последний элемент массива displayedColumns, чтобы удалить последний столбец нашей таблицы.

removeColumn() {
    this.columnsToDisplay.pop(); //removes the last element of the array
}

11
задан Kip 21 November 2008 в 19:59
поделиться

7 ответов

Вы перепутываете "переопределение" и "перегрузку".

Переопределение - добавление заменяющего определения существующего метода в целях полиморфизма. Метод должен иметь ту же подпись. Подпись состоит из имени и типов аргумента. Переопределенные методы выбраны во времени выполнения на основе типа выполнения целевого объекта.

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

24
ответ дан 3 December 2019 в 01:09
поделиться

равняется (Объект), переопределяет вышестоящий метод; Вы не можете переопределить вышестоящий метод, не используя ту же самую подпись (Ну, существуют некоторые исключения как ковариантный returntypes и исключение).

12
ответ дан 3 December 2019 в 01:09
поделиться

Заметьте, что метод, который Вы называете, определяется в javadoc для ArrayList<E> как

boolean contains(Object o)
    Returns true if this list contains the specified element. 

вместо

boolean contains(E o)
    Returns true if this list contains the specified element. 

Реализация ArrayList.java:

private transient Object elementData[];

public boolean contains(Object elem) {
    return indexOf(elem) >= 0;
}

public int indexOf(Object elem) {
    if (elem == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (elem.equals(elementData[i]))
                return i;
    }
    return -1;
}

Это использует, равняется методу, определенному в Объектном суперклассе, так как равняется методу, не переопределяется в ArrayList<E> реализация.

Когда переопределение Объекта равняется в Java, необходимо переопределить Объектный метод хэш-кода также.

Так или иначе Вы могли бы хотеть попробовать следующий код:

class A{    
    public int content;    
    A(){
        this(0);
    }    
    A(int value){
        content = value;
    }   
    public boolean equals(Object obj){
        System.out.println("overriding equals method");
        return this.content == ((A) obj).content;
    }    
    public boolean equals(A a){
        System.out.println("overloading equals method");
        return this.content == a.content;
    }    
    public static void main(String[] args){
        A x = new A(1);
        A y = new A(2);
        Object z  = new A(1);
        System.out.println(x.equals(y));
        System.out.println(x.equals(x));
        System.out.println(x.equals(z));
        //override as z is declared as Object at compile time
        //so it will use methods in class Object instead of class A
        System.out.println(x.equals((Object) y));
        System.out.println(x.equals((Object) x));        
    }   
}
//rant: they didn't teach me these in javaschool and I had to learn it the hard way.
6
ответ дан 3 December 2019 в 01:09
поделиться

существуют различные типы http://en.wikipedia.org/wiki/Polymorphism_ (computer_science). Java не делает http://en.wikipedia.org/wiki/Double_dispatch.

3
ответ дан 3 December 2019 в 01:09
поделиться

Реализация ArrayList содержит (Объектный) метод, обязан использовать Object.equals (Объект) метод внутренне, таким образом, это никогда не будет знать о Вашей перегрузке равняния (MyClass) метод. Только метод переопределения (с соответствием подписи) будет найден.

2
ответ дан 3 December 2019 в 01:09
поделиться

Хорошо позвольте мне перефразировать.

(1) Поскольку компилятор устраняет всю информацию относительно к Дженерикам (стирание, посмотрите здесь), и (2) потому что Вы не можете переопределить метод без той же самой подписи (равняется (Объект)), (3) во время времени выполнения все объекты в Списке рассматривают как Объекты и не как экземпляры MyClass. Следовательно, метод, который называют, равняется (Объект), так как это - то, которое явлено перезаписано Вашим классом.

-1
ответ дан 3 December 2019 в 01:09
поделиться

Вы предполагаете что contains() метод в List знает тип объекта во времени выполнения, которое является неправильным.

Из-за стирания, List<MyClass> становится просто постоянным клиентом List во времени выполнения, таким образом, contains() метод рассматривает свой параметр как Object, таким образом вызов Object's equals() вместо того Вы определили для MyClass в его выполнении.

-1
ответ дан 3 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: