В качестве решения я приведу лишь один пример, потому что это не сложно, и вы можете найти решение в документах . Просто перенеси эту ситуацию на свою.
Попробуйте использовать подход, аналогичный документам, поэтому разделите отображаемые данные для столбцов, строк и общих данных для таблицы.
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
}
Вы перепутываете "переопределение" и "перегрузку".
Переопределение - добавление заменяющего определения существующего метода в целях полиморфизма. Метод должен иметь ту же подпись. Подпись состоит из имени и типов аргумента. Переопределенные методы выбраны во времени выполнения на основе типа выполнения целевого объекта.
Перегрузка - добавление метода с тем же именем, но другой подписью. Перегруженные методы выбраны во время компиляции на основе типа времени компиляции целевого объекта.
равняется (Объект), переопределяет вышестоящий метод; Вы не можете переопределить вышестоящий метод, не используя ту же самую подпись (Ну, существуют некоторые исключения как ковариантный returntypes и исключение).
Заметьте, что метод, который Вы называете, определяется в 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.
существуют различные типы http://en.wikipedia.org/wiki/Polymorphism_ (computer_science). Java не делает http://en.wikipedia.org/wiki/Double_dispatch.
Реализация ArrayList содержит (Объектный) метод, обязан использовать Object.equals (Объект) метод внутренне, таким образом, это никогда не будет знать о Вашей перегрузке равняния (MyClass) метод. Только метод переопределения (с соответствием подписи) будет найден.
Хорошо позвольте мне перефразировать.
(1) Поскольку компилятор устраняет всю информацию относительно к Дженерикам (стирание, посмотрите здесь), и (2) потому что Вы не можете переопределить метод без той же самой подписи (равняется (Объект)), (3) во время времени выполнения все объекты в Списке рассматривают как Объекты и не как экземпляры MyClass. Следовательно, метод, который называют, равняется (Объект), так как это - то, которое явлено перезаписано Вашим классом.
Вы предполагаете что contains()
метод в List
знает тип объекта во времени выполнения, которое является неправильным.
Из-за стирания, List<MyClass>
становится просто постоянным клиентом List
во времени выполнения, таким образом, contains()
метод рассматривает свой параметр как Object
, таким образом вызов Object's equals()
вместо того Вы определили для MyClass
в его выполнении.