2015-10-11 3 views
1

Я работаю с кодом ниже. Интерфейс списка указывает два перегруженных метода remove(). Я не могу понять, как определить, какая из них использует Java, если мы вызываем remove (3) в List. Как мы можем заставить Java использовать другую?Интерфейс списка - Java

public class ArrayList<E> implements List1<E> { 

    private E[] data; 
    private int size; 

    public ArrayList(){ 
     data = (E[]) (new Object[1]); 
     size = 0; 
    } 

    public void add(E target) { 
     if (isFull()) { 
      stretch(); 
     } 
     data[size] = target; 
     size++; 
    } 

    public boolean isEmpty() { 
     return size == 0; 
    } 

    protected boolean isFull() { 
     return size == data.length; 
    } 

    public E get(int index) { 
     return data[index]; 
    } 

    public void set(int index, E target) { 
     data[index] = target; 
    } 

    public int size() { 
     return size; 
    } 

    protected void stretch() { 
     E[] newData = (E[]) (new Object[data.length * 2]); 
     for (int i = 0; i < data.length; i++) { 
      newData[i] = data[i]; 
     } 
     data = newData; 
    } 


    public boolean contains(E target) { 
     for (int i = 0; i < size; i++) { 
      if (data[i].equals(target)) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public String toString() { 
     String result = "["; 
     for (int i = 0; i < size; i++) { 
      result += data[i] + ""; 
     } 
     return result + "]"; 
    } 

    public E remove(int index) { 
     E result = data[index]; 
     for (int i = index; i < size; i++) { 
      data[i - 1] = data[i]; 
     } 
     size--; 
     return result; 
    } 

    public boolean remove(E target) { 
     for (int i = 0; i < size; i++) { 
      if (data[i].equals(target)){ 
      } 
      size--; 
      return true; 
     } 
     return false; 
    } 

    public static interface List1<E> { 

     public void add(E target); 
     public boolean contains(E traget); 
     public E get(int index); 
     public boolean isEmpty(); 
     public E remove(int index); 
     public boolean remove(E index); 
     public void set(int index, E target); 
     public int size(); 
    } 
} 
+2

'3' - это незанятое целое число. Я считаю, что вы можете сделать что-то вроде 'remove (new Integer (3));' для вызова второго метода удаления. – Kevin

ответ

1

У вас есть две remove() функции с различными типами возврата данных и различные функции перегрузки типов данных. Таким образом, Java сможет различать эти функции на основе этих параметров и, таким образом, выберет подходящую функцию вашего вызова. Вы не можете просто заставить Java использовать другую, если вы не хотите назвать это явно от первого следующим образом:

remove(datatype1 var1) { 
    remove(var2); //datatype2 of var2 
    //your code 
} 

remove(datatype2 var) { 
    //your code 
} 
+0

Возможно, потому что 3 - это int no? –

+0

@AdamDiStefano Нет, это потому, что ссылка перегруженных значений происходит из ссылки Integer, а не только потому, что это число. Он все равно сможет различать одинаковые числа разных типов данных. Напр. он будет передаваться как 'int' if' remove (3) ', и он будет передаваться как' double ', если' 'remove (3f)' вызывается. Помните, что вам нужно определить 2 разные функции 'remove()' для этих 2 вызовов. –

0

Если вы видите эти два метода удалить это очень ясно, что один взять индекс объекта в списке в то время как другие берут Object для удаления. Объектом является объект типа списка. Поэтому, если вы хотите использовать другие, просто передайте объект, который содержится в arrayList. Например:

Если список содержит целые числа:

List<Foo> integerList = new ArrayList<Foo>(); 
Foo foo = new Foo(); 
Foo foo1 = new Foo(); 
integerList.add(foo); 
integerList.add(foo1); 
integerList.remove(foo);//remove 1 
integerList.remove(0);//remove 2 

В выше remove1 вызвать метод удаления (цель Е) будет вызвана, с другой стороны, при удалить 2 вызова метода удалить (INT индекс) будет вызван.

Смежные вопросы