Java匿名内部类List

时间:2015-02-26 22:00:40

标签: java

我想在运行时通过匿名内部类将方法附加到LinkedList对象。这可能吗?

例如:

    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);

无需执行if(list_i不为null)addAll(list_i) ?

这看起来不可能,因为LinkedList没有AddAllIfNotNull方法。有没有办法使这项工作?

4 个答案:

答案 0 :(得分: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);
         }
     }
   }
}

答案 1 :(得分:1)

您无法使用新签名添加新方法,因为类型保留LinkedList<String>

执行所需操作的方法是从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);

答案 2 :(得分:0)

我认为应该接受Hovercraft的答案,但另一个选择是覆盖LinkedList<T>上的某些方法 - 比如boolean addAll(Collection<? extends E> c),在调用{{1}之前可以进行空检查。 (有效地阻止它抛出super.addAll(c))。这样你就可以调用NullPointerException并仍然使用匿名类。但是,应谨慎使用此技术。可以合理地期望addAll在给定null参数的情况下抛出异常。使用命名类可以避免这种混淆。

答案 3 :(得分:-2)

这是不可能的,你不应该这样做。相反,使它成为一个静态方法。