2015-02-26 8 views
3

Я хочу привязать метод к объекту LinkedList во время выполнения через анонимный внутренний класс. Это возможно?Java anonymous внутренний класс списка

Например:

LinkedList<String> paths = new LinkedList<String>() { 
     void addAllIfNotNull(Collection<String> c) { 
      if(c != null) { 
       addAll(c); 
      } 
     } 
    }; 
    paths.add(list1); 
    paths.add(list2); 
    paths.add(list3); 
    ... 
    paths.add(listN); 

без необходимости делать, если (list_i не ноль) addAll (list_i) ?

Это не похоже, что это возможно, потому что LinkedList не имеет метода AddAllIfNotNull. Есть ли способ сделать эту работу?

ответ

1

Вы не можете добавить новый метод с новой подписью, так как тип остается LinkedList<String>.

Способ сделать то, что вы хотите, чтобы overide существующего метода addAll() из LinkedList<T>, таким образом:

LinkedList<String> paths = new LinkedList<String>() { 
     public boolean addAll(Collection<? extends String> c) { 
      System.out.println("In overiden addAll"); 
      if(c != null) { 
       return super.addAll(c); 
      } 
      return false; 
     } 
    }; 
    // This now works 
    paths.addAll(null); 
+0

@ DimaMaligin ??? Я называю 'super.addAll()', и я не понимаю, почему это плохая идея. Это короткий отрезок для расширения 'LinkedList '. –

+0

Да, вы делаете это, я удалил комментарий. Не видел его там. –

+0

Неплохое решение, 1+, и, безусловно, намного лучше, чем ответ райтфолд. Использовать статический метод? Серьезное? –

6

Это невозможно через анонимный внутренний класс. Это может быть сделано с неанонимным внутренним классом или автономным классом, но не анонимным, поскольку компилятор не сможет распознать метод, поскольку в компиляторе переменная имеет тип LinkedList, и если вы хотите переменная, что бы вы ее выбрали, поскольку нужный тип является анонимным?

Вопрос для вас: что происходит, когда вы пытаетесь это сделать? Скомпилируется ли при попытке вызова метода?

например,

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.LinkedList; 
import java.util.List; 

public class LinkedListFoo { 
    public LinkedListFoo() { 
     List<String> list = new ArrayList<>(); 

     MyLinkedList<String> paths = new MyLinkedList<>(); 
     paths.addAllIfNotNull(list);  
    } 

    // non-anonymous inner class 
    private class MyLinkedList<T> extends LinkedList<T> { 
     void addAllIfNotNull(Collection<T> c) { 
     if(c != null) { 
      addAll(c); 
     } 
    } 
    } 
} 
+0

Нет, не компилируется, потому что addAllIfNotNull не является функцией в связанном списке. У вас есть пример того, что вы имеете в виду под названием внутренний класс? – doorfly

+0

@doorfly: например. –

-2

Это не возможно, и вы не должны делать это. Вместо этого сделайте его статическим методом.

0

Я думаю, что ответ суда на воздушной подушке должен быть принят, но еще один вариант для вас, чтобы переопределить какой-то метод на LinkedList<T> --say, boolean addAll(Collection<? extends E> c), в котором вы можете выполнить нулевую проверку перед вызовом super.addAll(c) (эффективно предотвращая его выброс NullPointerException). Таким образом вы можете позвонить addAll и использовать анонимный класс. Однако этот метод следует использовать осторожно. java.util.LinkedList#addAll можно разумно ожидать выброс исключения с учетом нулевого параметра. Использование именованного класса позволяет избежать этой путаницы.